galaaz 0.4.6 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +3575 -118
  3. data/Rakefile +21 -4
  4. data/bin/gknit +152 -6
  5. data/bin/gknit-draft +105 -0
  6. data/bin/gknit-draft.rb +28 -0
  7. data/bin/gknit_Rscript +127 -0
  8. data/bin/grun +27 -1
  9. data/bin/gstudio +47 -4
  10. data/bin/{gstudio.rb → gstudio_irb.rb} +0 -0
  11. data/bin/gstudio_pry.rb +7 -0
  12. data/blogs/galaaz_ggplot/galaaz_ggplot.Rmd +3 -12
  13. data/blogs/galaaz_ggplot/galaaz_ggplot.html +77 -222
  14. data/blogs/galaaz_ggplot/galaaz_ggplot.md +4 -31
  15. data/blogs/galaaz_ggplot/galaaz_ggplot.pdf +0 -0
  16. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/midwest_rb.png +0 -0
  17. data/blogs/galaaz_ggplot/galaaz_ggplot_files/figure-html/scatter_plot_rb.png +0 -0
  18. data/blogs/galaaz_ggplot/midwest.Rmd +1 -9
  19. data/blogs/gknit/gknit.Rmd +232 -123
  20. data/blogs/{dev/dev.html → gknit/gknit.html} +1897 -33
  21. data/blogs/gknit/gknit.pdf +0 -0
  22. data/blogs/gknit/lst.rds +0 -0
  23. data/blogs/gknit/stats.bib +27 -0
  24. data/blogs/manual/lst.rds +0 -0
  25. data/blogs/manual/manual.Rmd +1893 -47
  26. data/blogs/manual/manual.html +3153 -347
  27. data/blogs/manual/manual.md +3575 -118
  28. data/blogs/manual/manual.pdf +0 -0
  29. data/blogs/manual/manual.tex +4026 -0
  30. data/blogs/manual/manual_files/figure-html/bubble-1.png +0 -0
  31. data/blogs/manual/manual_files/figure-html/diverging_bar.png +0 -0
  32. data/blogs/manual/manual_files/figure-latex/bubble-1.png +0 -0
  33. data/blogs/manual/manual_files/figure-latex/diverging_bar.pdf +0 -0
  34. data/blogs/{dev → manual}/model.rb +0 -0
  35. data/blogs/nse_dplyr/nse_dplyr.Rmd +849 -0
  36. data/blogs/nse_dplyr/nse_dplyr.html +878 -0
  37. data/blogs/nse_dplyr/nse_dplyr.md +1198 -0
  38. data/blogs/nse_dplyr/nse_dplyr.pdf +0 -0
  39. data/blogs/oh_my/oh_my.html +274 -386
  40. data/blogs/oh_my/oh_my.md +208 -205
  41. data/blogs/ruby_plot/ruby_plot.Rmd +64 -84
  42. data/blogs/ruby_plot/ruby_plot.html +235 -208
  43. data/blogs/ruby_plot/ruby_plot.md +239 -34
  44. data/blogs/ruby_plot/ruby_plot.pdf +0 -0
  45. data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.png +0 -0
  46. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.png +0 -0
  47. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.png +0 -0
  48. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.png +0 -0
  49. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.png +0 -0
  50. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_decorations.png +0 -0
  51. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.png +0 -0
  52. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.png +0 -0
  53. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.png +0 -0
  54. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.png +0 -0
  55. data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.png +0 -0
  56. data/examples/Bibliography/master.bib +50 -0
  57. data/examples/Bibliography/stats.bib +72 -0
  58. data/examples/islr/ch2.spec.rb +1 -1
  59. data/examples/islr/ch3_boston.rb +4 -4
  60. data/examples/islr/x_y_rnorm.jpg +0 -0
  61. data/examples/latex_templates/Test-acm_article/Makefile +16 -0
  62. data/examples/latex_templates/Test-acm_article/Test-acm_article.Rmd +65 -0
  63. data/examples/latex_templates/Test-acm_article/acm_proc_article-sp.cls +1670 -0
  64. data/examples/latex_templates/Test-acm_article/sensys-abstract.cls +703 -0
  65. data/examples/latex_templates/Test-acm_article/sigproc.bib +59 -0
  66. data/examples/latex_templates/Test-acs_article/Test-acs_article.Rmd +260 -0
  67. data/examples/latex_templates/Test-acs_article/Test-acs_article.pdf +0 -0
  68. data/examples/latex_templates/Test-acs_article/acs-Test-acs_article.bib +11 -0
  69. data/examples/latex_templates/Test-acs_article/acs-my_output.bib +11 -0
  70. data/examples/latex_templates/Test-acs_article/acstest.bib +17 -0
  71. data/examples/latex_templates/Test-aea_article/AEA.cls +1414 -0
  72. data/examples/latex_templates/Test-aea_article/BibFile.bib +0 -0
  73. data/examples/latex_templates/Test-aea_article/Test-aea_article.Rmd +108 -0
  74. data/examples/latex_templates/Test-aea_article/Test-aea_article.pdf +0 -0
  75. data/examples/latex_templates/Test-aea_article/aea.bst +1269 -0
  76. data/examples/latex_templates/Test-aea_article/multicol.sty +853 -0
  77. data/examples/latex_templates/Test-aea_article/references.bib +0 -0
  78. data/examples/latex_templates/Test-aea_article/setspace.sty +546 -0
  79. data/examples/latex_templates/Test-amq_article/Test-amq_article.Rmd +256 -0
  80. data/examples/latex_templates/Test-amq_article/Test-amq_article.pdf +0 -0
  81. data/examples/latex_templates/Test-amq_article/Test-amq_article.pdfsync +3397 -0
  82. data/examples/latex_templates/Test-amq_article/pics/Figure2.pdf +0 -0
  83. data/examples/latex_templates/Test-ams_article/Test-ams_article.Rmd +215 -0
  84. data/examples/latex_templates/Test-ams_article/amstest.bib +436 -0
  85. data/examples/latex_templates/Test-asa_article/Test-asa_article.Rmd +153 -0
  86. data/examples/latex_templates/Test-asa_article/Test-asa_article.pdf +0 -0
  87. data/examples/latex_templates/Test-asa_article/agsm.bst +1353 -0
  88. data/examples/latex_templates/Test-asa_article/bibliography.bib +233 -0
  89. data/examples/latex_templates/Test-ieee_article/IEEEtran.bst +2409 -0
  90. data/examples/latex_templates/Test-ieee_article/IEEEtran.cls +6346 -0
  91. data/examples/latex_templates/Test-ieee_article/Test-ieee_article.Rmd +175 -0
  92. data/examples/latex_templates/Test-ieee_article/Test-ieee_article.pdf +0 -0
  93. data/examples/latex_templates/Test-ieee_article/mybibfile.bib +20 -0
  94. data/examples/latex_templates/Test-rjournal_article/RJournal.sty +335 -0
  95. data/examples/latex_templates/Test-rjournal_article/RJreferences.bib +18 -0
  96. data/examples/latex_templates/Test-rjournal_article/RJwrapper.pdf +0 -0
  97. data/examples/latex_templates/Test-rjournal_article/Test-rjournal_article.Rmd +52 -0
  98. data/examples/latex_templates/Test-springer_article/Test-springer_article.Rmd +65 -0
  99. data/examples/latex_templates/Test-springer_article/Test-springer_article.pdf +0 -0
  100. data/examples/latex_templates/Test-springer_article/bibliography.bib +26 -0
  101. data/examples/latex_templates/Test-springer_article/spbasic.bst +1658 -0
  102. data/examples/latex_templates/Test-springer_article/spmpsci.bst +1512 -0
  103. data/examples/latex_templates/Test-springer_article/spphys.bst +1443 -0
  104. data/examples/latex_templates/Test-springer_article/svglov3.clo +113 -0
  105. data/examples/latex_templates/Test-springer_article/svjour3.cls +1431 -0
  106. data/examples/misc/moneyball.rb +1 -1
  107. data/examples/misc/subsetting.rb +37 -37
  108. data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.Rmd +73 -0
  109. data/examples/rmarkdown/svm-rmarkdown-anon-ms-example/svm-rmarkdown-anon-ms-example.pdf +0 -0
  110. data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.Rmd +382 -0
  111. data/examples/rmarkdown/svm-rmarkdown-article-example/svm-rmarkdown-article-example.pdf +0 -0
  112. data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.Rmd +164 -0
  113. data/examples/rmarkdown/svm-rmarkdown-beamer-example/svm-rmarkdown-beamer-example.pdf +0 -0
  114. data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.Rmd +92 -0
  115. data/examples/rmarkdown/svm-rmarkdown-cv/svm-rmarkdown-cv.pdf +0 -0
  116. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/attend-grade-relationships.csv +482 -0
  117. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.Rmd +280 -0
  118. data/examples/rmarkdown/svm-rmarkdown-syllabus-example/svm-rmarkdown-syllabus-example.pdf +0 -0
  119. data/examples/rmarkdown/svm-xaringan-example/svm-xaringan-example.Rmd +386 -0
  120. data/lib/R_interface/r.rb +2 -2
  121. data/lib/R_interface/r_libs.R +6 -1
  122. data/lib/R_interface/r_methods.rb +12 -2
  123. data/lib/R_interface/rdata_frame.rb +8 -17
  124. data/lib/R_interface/rindexed_object.rb +1 -2
  125. data/lib/R_interface/rlist.rb +1 -0
  126. data/lib/R_interface/robject.rb +20 -23
  127. data/lib/R_interface/rpkg.rb +15 -6
  128. data/lib/R_interface/rsupport.rb +13 -19
  129. data/lib/R_interface/ruby_extensions.rb +14 -18
  130. data/lib/R_interface/rvector.rb +0 -12
  131. data/lib/gknit.rb +2 -0
  132. data/lib/gknit/draft.rb +105 -0
  133. data/lib/gknit/knitr_engine.rb +6 -37
  134. data/lib/util/exec_ruby.rb +22 -84
  135. data/lib/util/inline_file.rb +7 -3
  136. data/specs/figures/bg.jpeg +0 -0
  137. data/specs/figures/bg.png +0 -0
  138. data/specs/figures/bg.svg +2 -2
  139. data/specs/figures/dose_len.png +0 -0
  140. data/specs/figures/no_args.jpeg +0 -0
  141. data/specs/figures/no_args.png +0 -0
  142. data/specs/figures/no_args.svg +2 -2
  143. data/specs/figures/width_height.jpeg +0 -0
  144. data/specs/figures/width_height.png +0 -0
  145. data/specs/figures/width_height_units1.jpeg +0 -0
  146. data/specs/figures/width_height_units1.png +0 -0
  147. data/specs/figures/width_height_units2.jpeg +0 -0
  148. data/specs/figures/width_height_units2.png +0 -0
  149. data/specs/r_dataframe.spec.rb +184 -11
  150. data/specs/r_list.spec.rb +4 -4
  151. data/specs/r_list_apply.spec.rb +11 -10
  152. data/specs/ruby_expression.spec.rb +3 -11
  153. data/specs/tmp.rb +106 -34
  154. data/version.rb +1 -1
  155. metadata +96 -33
  156. data/bin/gknit_old_r +0 -236
  157. data/blogs/dev/dev.Rmd +0 -77
  158. data/blogs/dev/dev.md +0 -87
  159. data/blogs/dev/dev_files/figure-html/bubble-1.png +0 -0
  160. data/blogs/dev/dev_files/figure-html/diverging_bar. +0 -0
  161. data/blogs/dev/dev_files/figure-html/diverging_bar.png +0 -0
  162. data/blogs/dplyr/dplyr.rb +0 -63
  163. data/blogs/galaaz_ggplot/galaaz_ggplot.aux +0 -43
  164. data/blogs/galaaz_ggplot/galaaz_ggplot.log +0 -640
  165. data/blogs/galaaz_ggplot/galaaz_ggplot.out +0 -10
  166. data/blogs/galaaz_ggplot/galaaz_ggplot.tex +0 -481
  167. data/blogs/galaaz_ggplot/midwest.png +0 -0
  168. data/blogs/galaaz_ggplot/scatter_plot.png +0 -0
  169. data/blogs/ruby_plot/ruby_plot.Rmd_external_figs +0 -662
  170. data/blogs/ruby_plot/ruby_plot.tex +0 -1077
  171. data/blogs/ruby_plot/ruby_plot_files/figure-html/dose_len.svg +0 -57
  172. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_delivery.svg +0 -106
  173. data/blogs/ruby_plot/ruby_plot_files/figure-html/facet_by_dose.svg +0 -110
  174. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color.svg +0 -174
  175. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_by_delivery_color2.svg +0 -236
  176. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_jitter.svg +0 -296
  177. data/blogs/ruby_plot/ruby_plot_files/figure-html/facets_with_points.svg +0 -236
  178. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_box_plot.svg +0 -218
  179. data/blogs/ruby_plot/ruby_plot_files/figure-html/final_violin_plot.svg +0 -128
  180. data/blogs/ruby_plot/ruby_plot_files/figure-html/violin_with_jitter.svg +0 -150
  181. data/examples/paper/paper.rb +0 -36
@@ -10,10 +10,10 @@
10
10
 
11
11
 
12
12
  <meta name="author" content="Rodrigo Botafogo" />
13
+ <meta name="author" content="Daniel Mossé - University of Pittsburgh" />
13
14
 
14
- <meta name="date" content="2018-10-19" />
15
15
 
16
- <title>gKnit - Ruby and R Knitting with Galaaz in GraalVM</title>
16
+ <title>How to do reproducible research in Ruby with gKnit</title>
17
17
 
18
18
  <script>/*! jQuery v1.11.3 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */
19
19
  !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.3",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b="length"in a&&a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function qa(){}qa.prototype=d.filters=d.pseudos,d.setFilters=new qa,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function ra(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;
@@ -283,6 +283,9 @@ img {
283
283
  button.code-folding-btn:focus {
284
284
  outline: none;
285
285
  }
286
+ summary {
287
+ display: list-item;
288
+ }
286
289
  </style>
287
290
 
288
291
 
@@ -290,10 +293,71 @@ button.code-folding-btn:focus {
290
293
  <div class="container-fluid main-container">
291
294
 
292
295
  <!-- tabsets -->
296
+
297
+ <style type="text/css">
298
+ .tabset-dropdown > .nav-tabs {
299
+ display: inline-table;
300
+ max-height: 500px;
301
+ min-height: 44px;
302
+ overflow-y: auto;
303
+ background: white;
304
+ border: 1px solid #ddd;
305
+ border-radius: 4px;
306
+ }
307
+
308
+ .tabset-dropdown > .nav-tabs > li.active:before {
309
+ content: "";
310
+ font-family: 'Glyphicons Halflings';
311
+ display: inline-block;
312
+ padding: 10px;
313
+ border-right: 1px solid #ddd;
314
+ }
315
+
316
+ .tabset-dropdown > .nav-tabs.nav-tabs-open > li.active:before {
317
+ content: "";
318
+ border: none;
319
+ }
320
+
321
+ .tabset-dropdown > .nav-tabs.nav-tabs-open:before {
322
+ content: "";
323
+ font-family: 'Glyphicons Halflings';
324
+ display: inline-block;
325
+ padding: 10px;
326
+ border-right: 1px solid #ddd;
327
+ }
328
+
329
+ .tabset-dropdown > .nav-tabs > li.active {
330
+ display: block;
331
+ }
332
+
333
+ .tabset-dropdown > .nav-tabs > li > a,
334
+ .tabset-dropdown > .nav-tabs > li > a:focus,
335
+ .tabset-dropdown > .nav-tabs > li > a:hover {
336
+ border: none;
337
+ display: inline-block;
338
+ border-radius: 4px;
339
+ }
340
+
341
+ .tabset-dropdown > .nav-tabs.nav-tabs-open > li {
342
+ display: block;
343
+ float: none;
344
+ }
345
+
346
+ .tabset-dropdown > .nav-tabs > li {
347
+ display: none;
348
+ }
349
+ </style>
350
+
293
351
  <script>
294
352
  $(document).ready(function () {
295
353
  window.buildTabsets("TOC");
296
354
  });
355
+
356
+ $(document).ready(function () {
357
+ $('.tabset-dropdown > .nav-tabs > li').click(function () {
358
+ $(this).parent().toggleClass('nav-tabs-open')
359
+ });
360
+ });
297
361
  </script>
298
362
 
299
363
  <!-- code folding -->
@@ -302,24 +366,173 @@ $(document).ready(function () {
302
366
 
303
367
 
304
368
 
305
-
306
369
  <div class="fluid-row" id="header">
307
370
 
308
371
 
309
372
 
310
- <h1 class="title toc-ignore">gKnit - Ruby and R Knitting with Galaaz in GraalVM</h1>
373
+ <h1 class="title toc-ignore">How to do reproducible research in Ruby with gKnit</h1>
311
374
  <h4 class="author"><em>Rodrigo Botafogo</em></h4>
312
- <h4 class="date"><em>19 October 2018</em></h4>
375
+ <h4 class="author"><em>Daniel Mossé - University of Pittsburgh</em></h4>
376
+ <h4 class="date"><em>29/04/2019</em></h4>
313
377
 
314
378
  </div>
315
379
 
316
380
 
317
381
  <div id="introduction" class="section level1">
318
382
  <h1>Introduction</h1>
383
+ <p>The idea of “literate programming” was first introduced by Donald Knuth in the 1980’s <span class="citation">(Knuth 1984)</span>. The main intention of this approach was to develop software interspersing macro snippets, traditional source code, and a natural language such as English in a document that could be compiled into executable code and at the same time easily read by a human developer. According to Knuth “The practitioner of literate programming can be regarded as an essayist, whose main concern is with exposition and excellence of style.”</p>
384
+ <p>The idea of literate programming evolved into the idea of reproducible research, in which all the data, software code, documentation, graphics etc. needed to reproduce the research and its reports could be included in a single document or set of documents that when distributed to peers could be rerun generating the same output and reports.</p>
385
+ <p>The R community has put a great deal of effort in reproducible research. In 2002, Sweave was introduced and it allowed mixing R code with Latex generating high quality PDF documents. A Sweave document could include code, the results of executing the code, graphics and text such that it contained the whole narrative to reproduce the research. In 2012, Knitr, developed by Yihui Xie from RStudio was released to replace Sweave and to consolidate in one single package the many extensions and add-on packages that were necessary for Sweave.</p>
386
+ <p>With Knitr, <strong>R markdown</strong> was also developed, an extension to the Markdown format. With <strong>R markdown</strong> and Knitr it is possible to generate reports in a multitude of formats such as HTML, markdown, Latex, PDF, dvi, etc. <strong>R markdown</strong> also allows the use of multiple programming languages such as R, Ruby, Python, etc. in the same document.</p>
387
+ <p>In <strong>R markdown</strong>, text is interspersed with code chunks that can be executed and both the code and its results can become part of the final report. Although <strong>R markdown</strong> allows multiple programming languages in the same document, only R and Python (with the reticulate package) can persist variables between chunks. For other languages, such as Ruby, every chunk will start a new process and thus all data is lost between chunks, unless it is somehow stored in a data file that is read by the next chunk.</p>
388
+ <p>Being able to persist data between chunks is critical for literate programming otherwise the flow of the narrative is lost by all the effort of having to save data and then reload it. Although this might, at first, seem like a small nuisance, not being able to persist data between chunks is a major issue. For example, let’s take a look at the following simple example in which we want to show how to create a list and the use it. Let’s first assume that data cannot be persisted between chunks. In the next chunk we create a list, then we would need to save it to file, but to save it, we need somehow to marshal the data into a binary format:</p>
389
+ <pre class="ruby"><code>lst = R.list(a: 1, b: 2, c: 3)
390
+ lst.saveRDS(&quot;lst.rds&quot;)</code></pre>
391
+ <p>then, on the next chunk, where variable ‘lst’ is used, we need to read back it’s value</p>
392
+ <pre class="ruby"><code>lst = R.readRDS(&quot;lst.rds&quot;)
393
+ puts lst</code></pre>
394
+ <pre><code>## $a
395
+ ## [1] 1
396
+ ##
397
+ ## $b
398
+ ## [1] 2
399
+ ##
400
+ ## $c
401
+ ## [1] 3</code></pre>
402
+ <p>Now, any single code has dozens of variables that we might want to use and reuse between chunks. Clearly, such an approach becomes quickly unmanageable. Probably, because of this problem, it is very rare to see any <strong>R markdown</strong> document in the Ruby community.</p>
403
+ <p>When variables can be used accross chunks, then no overhead is needed:</p>
404
+ <pre class="ruby"><code>lst = R.list(a: 1, b: 2, c: 3)
405
+ # any other code can be added here</code></pre>
406
+ <pre class="ruby"><code>puts lst</code></pre>
407
+ <pre><code>## $a
408
+ ## [1] 1
409
+ ##
410
+ ## $b
411
+ ## [1] 2
412
+ ##
413
+ ## $c
414
+ ## [1] 3</code></pre>
415
+ <p>In the Python community, the same effort to have code and text in an integrated environment started around the first decade of 2000. In 2006 iPython 0.7.2 was released. In 2014, Fernando Pérez, spun off project Jupyter from iPython creating a web-based interactive computation environment. Jupyter can now be used with many languages, including Ruby with the iruby gem (<a href="https://github.com/SciRuby/iruby" class="uri">https://github.com/SciRuby/iruby</a>). In order to have multiple languages in a Jupyter notebook the SoS kernel was developed (<a href="https://vatlab.github.io/sos-docs/" class="uri">https://vatlab.github.io/sos-docs/</a>).</p>
416
+ </div>
417
+ <div id="gknitting-a-document" class="section level1">
418
+ <h1>gKnitting a Document</h1>
419
+ <p>This document describes gKnit. gKnit is based on knitr and <strong>R markdown</strong> and can knit a document written both in Ruby and/or R and output it in any of the available formats of <strong>R markdown</strong>. gKnit allows ruby developers to do literate programming and reproducible research by allowing them to have in a single document, text and code.</p>
420
+ <p>gKnit runs atop of GraalVM, and Galaaz (an integration library between Ruby and R - see bellow). In gKnit, Ruby variables are persisted between chunks, making it an ideal solution for literate programming in this language. Also, since it is based on Galaaz, Ruby chunks can have access to R variables and Polyglot Programming with Ruby and R is quite natural.</p>
421
+ <p>Galaaz has already been describe in the following posts:</p>
422
+ <ul>
423
+ <li><a href="https://towardsdatascience.com/ruby-plotting-with-galaaz-an-example-of-tightly-coupling-ruby-and-r-in-graalvm-520b69e21021" class="uri">https://towardsdatascience.com/ruby-plotting-with-galaaz-an-example-of-tightly-coupling-ruby-and-r-in-graalvm-520b69e21021</a>.<br />
424
+ </li>
425
+ <li><a href="https://medium.freecodecamp.org/how-to-make-beautiful-ruby-plots-with-galaaz-320848058857" class="uri">https://medium.freecodecamp.org/how-to-make-beautiful-ruby-plots-with-galaaz-320848058857</a></li>
426
+ </ul>
427
+ <p>This is not a blog post on <strong>R markdown</strong>, and the interested user is directed to the following links for detailed information on its capabilities and use.</p>
428
+ <ul>
429
+ <li><a href="https://rmarkdown.rstudio.com/" class="uri">https://rmarkdown.rstudio.com/</a> or</li>
430
+ <li><a href="https://bookdown.org/yihui/rmarkdown/" class="uri">https://bookdown.org/yihui/rmarkdown/</a></li>
431
+ </ul>
432
+ <p>In this post, we will describe just the main aspects of <strong>R markdown</strong>, so the user can start gKnitting Ruby and R documents quickly.</p>
433
+ <div id="the-yaml-header" class="section level2">
434
+ <h2>The Yaml header</h2>
435
+ <p>An <strong>R markdown</strong> document should start with a Yaml header and be stored in a file with ‘.Rmd’ extension. This document has the following header for gKitting an HTML document.</p>
436
+ <pre><code>---
437
+ title: &quot;How to do reproducible research in Ruby with gKnit&quot;
438
+ author:
439
+ - &quot;Rodrigo Botafogo&quot;
440
+ - &quot;Daniel Mossé - University of Pittsburgh&quot;
441
+ tags: [Tech, Data Science, Ruby, R, GraalVM]
442
+ date: &quot;20/02/2019&quot;
443
+ output:
444
+ html_document:
445
+ self_contained: true
446
+ keep_md: true
447
+ pdf_document:
448
+ includes:
449
+ in_header: [&quot;../../sty/galaaz.sty&quot;]
450
+ number_sections: yes
451
+ ---</code></pre>
452
+ <p>For more information on the options in the Yaml header, check <a href="https://bookdown.org/yihui/rmarkdown/html-document.html" class="uri">https://bookdown.org/yihui/rmarkdown/html-document.html</a>.</p>
453
+ </div>
454
+ <div id="r-markdown-formatting" class="section level2">
455
+ <h2><strong>R Markdown</strong> formatting</h2>
456
+ <p>Document formatting can be done with simple markups such as:</p>
457
+ <div id="headers" class="section level3">
458
+ <h3>Headers</h3>
459
+ <pre><code># Header 1
460
+
461
+ ## Header 2
462
+
463
+ ### Header 3
464
+ </code></pre>
465
+ </div>
466
+ <div id="lists" class="section level3">
467
+ <h3>Lists</h3>
468
+ <pre><code>Unordered lists:
469
+
470
+ * Item 1
471
+ * Item 2
472
+ + Item 2a
473
+ + Item 2b</code></pre>
474
+ <pre><code>Ordered Lists
475
+
476
+ 1. Item 1
477
+ 2. Item 2
478
+ 3. Item 3
479
+ + Item 3a
480
+ + Item 3b</code></pre>
481
+ <p>For more R markdown formatting go to <a href="https://rmarkdown.rstudio.com/authoring_basics.html" class="uri">https://rmarkdown.rstudio.com/authoring_basics.html</a>.</p>
482
+ </div>
483
+ <div id="r-chunks" class="section level3">
484
+ <h3>R chunks</h3>
485
+ <p>Running and executing Ruby and R code is actually what really interests us is this blog.<br />
486
+ Inserting a code chunk is done by adding code in a block delimited by three back ticks followed by an open curly brace (‘{’) followed with the engine name (r, ruby, rb, include, …), an any optional chunk_label and options, as shown bellow:</p>
487
+ <pre><code>```{engine_name [chunk_label], [chunk_options]}
488
+ ```</code></pre>
489
+ <p>for instance, let’s add an R chunk to the document labeled ‘first_r_chunk’. This is a very simple code just to create a variable and print it out, as follows:</p>
490
+ <pre><code>```{r first_r_chunk}
491
+ vec &lt;- c(1, 2, 3)
492
+ print(vec)
493
+ ```</code></pre>
494
+ <p>If this block is added to an <strong>R markdown</strong> document and gKnitted the result will be:</p>
495
+ <pre class="r"><code>vec &lt;- c(1, 2, 3)
496
+ print(vec)</code></pre>
497
+ <pre><code>## [1] 1 2 3</code></pre>
498
+ <p>Now let’s say that we want to do some analysis in the code, but just print the result and not the code itself. For this, we need to add the option ‘echo = FALSE’.</p>
499
+ <pre><code>```{r second_r_chunk, echo = FALSE}
500
+ vec2 &lt;- c(10, 20, 30)
501
+ vec3 &lt;- vec * vec2
502
+ print(vec3)
503
+ ```</code></pre>
504
+ <p>Here is how this block will show up in the document. Observe that the code is not shown and we only see the execution result in a white box</p>
505
+ <pre><code>## [1] 10 40 90</code></pre>
506
+ <p>A description of the available chunk options can be found in <a href="https://yihui.name/knitr/" class="uri">https://yihui.name/knitr/</a>.</p>
507
+ <p>Let’s add another R chunk with a function definition. In this example, a vector ‘r_vec’ is created and a new function ‘reduce_sum’ is defined. The chunk specification is</p>
508
+ <pre><code>```{r data_creation}
509
+ r_vec &lt;- c(1, 2, 3, 4, 5)
510
+
511
+ reduce_sum &lt;- function(...) {
512
+ Reduce(sum, as.list(...))
513
+ }
514
+ ```</code></pre>
515
+ <p>and this is how it will look like once executed. From now on, to be concise in the presentation we will not show chunk definitions any longer.</p>
516
+ <pre class="r"><code>r_vec &lt;- c(1, 2, 3, 4, 5)
517
+
518
+ reduce_sum &lt;- function(...) {
519
+ Reduce(sum, as.list(...))
520
+ }</code></pre>
521
+ <p>We can, possibly in another chunk, access the vector and call the function as follows:</p>
522
+ <pre class="r"><code>print(r_vec)</code></pre>
523
+ <pre><code>## [1] 1 2 3 4 5</code></pre>
524
+ <pre class="r"><code>print(reduce_sum(r_vec))</code></pre>
525
+ <pre><code>## [1] 15</code></pre>
526
+ </div>
527
+ <div id="r-graphics-with-ggplot" class="section level3">
528
+ <h3>R Graphics with ggplot</h3>
529
+ <p>In the following chunk, we create a bubble chart in R using ggplot and include it in this document. Note that there is no directive in the code to include the image, this occurs automatically. The ‘mpg’ dataframe is natively available to R and to Galaaz as well.</p>
530
+ <p>For the reader not knowledgeable of ggplot, ggplot is a graphics library based on “the grammar of graphics” <span class="citation">(Wilkinson 2005)</span>. The idea of the grammar of graphics is to build a graphics by adding layers to the plot. More information can be found in <a href="https://towardsdatascience.com/a-comprehensive-guide-to-the-grammar-of-graphics-for-effective-visualization-of-multi-dimensional-1f92b4ed4149" class="uri">https://towardsdatascience.com/a-comprehensive-guide-to-the-grammar-of-graphics-for-effective-visualization-of-multi-dimensional-1f92b4ed4149</a>.</p>
531
+ <p>In the plot bellow the ‘mpg’ dataset from base R is used. “The data concerns city-cycle fuel consumption in miles per gallon, to be predicted in terms of 3 multivalued discrete and 5 continuous attributes.” (Quinlan, 1993)</p>
532
+ <p>First, the ‘mpg’ dataset if filtered to extract only cars from the following manumactures: Audi, Ford, Honda, and Hyundai and stored in the ‘mpg_select’ variable. Then, the selected dataframe is passed to the ggplot function specifying in the aesthetic method (aes) that ‘displacement’ (disp) should be plotted in the ‘x’ axis and ‘city mileage’ should be on the ‘y’ axis. In the ‘labs’ layer we pass the ‘title’ and ‘subtitle’ for the plot. To the basic plot ‘g’, geom_jitter is added, that plots cars from the same manufactures with the same color (col=manufactures) and the size of the car point equal its high way consumption (size = hwy). Finally, a last layer is plotter containing a linear regression line (method = “lm”) for every manufacturer.</p>
319
533
  <pre class="r"><code># load package and data
320
534
  library(ggplot2)
321
535
  data(mpg, package=&quot;ggplot2&quot;)
322
- # mpg &lt;- read.csv(&quot;http://goo.gl/uEeRGu&quot;)
323
536
 
324
537
  mpg_select &lt;- mpg[mpg$manufacturer %in% c(&quot;audi&quot;, &quot;ford&quot;, &quot;honda&quot;, &quot;hyundai&quot;), ]
325
538
 
@@ -331,42 +544,1693 @@ g <- ggplot(mpg_select, aes(displ, cty)) +
331
544
 
332
545
  g + geom_jitter(aes(col=manufacturer, size=hwy)) +
333
546
  geom_smooth(aes(col=manufacturer), method=&quot;lm&quot;, se=F)</code></pre>
334
-

335
- <div id="plotting" class="section level3">
336
- <h3>Plotting</h3>
337
- <pre class="ruby"><code>require 'ggplot'
338
-
339
- R.theme_set R.theme_bw
340
-
341
- # Data Prep
547
+

548
+ </div>
549
+ <div id="ruby-chunks" class="section level3">
550
+ <h3>Ruby chunks</h3>
551
+ <p>Including a Ruby chunk is just as easy as including an R chunk in the document: just change the name of the engine to ‘ruby’. It is also possible to pass chunk options to the Ruby engine; however, this version does not accept all the options that are available to R chunks. Future versions will add those options.</p>
552
+ <pre><code>```{ruby first_ruby_chunk}
553
+ ```</code></pre>
554
+ <p>In this example, the ruby chunk is called ‘first_ruby_chunk’. One important aspect of chunk labels is that they cannot be duplicated. If a chunk label is duplicated, gKnit will stop with an error.</p>
555
+ <p>In the following chunk, variable ‘a’, ‘b’ and ‘c’ are standard Ruby variables and ‘vec’ and ‘vec2’ are two vectors created by calling the ‘c’ method on the R module.</p>
556
+ <p>In Galaaz, the R module allows us to access R functions transparently. The ‘c’ function in R, is a function that concatenates its arguments making a vector.</p>
557
+ <p>It should be clear that there is no requirement in gknit to call or use any R functions. gKnit will knit standard Ruby code, or even general text without any code.</p>
558
+ <pre class="ruby"><code>a = [1, 2, 3]
559
+ b = &quot;US$ 250.000&quot;
560
+ c = &quot;The 'outputs' function&quot;
561
+
562
+ vec = R.c(1, 2, 3)
563
+ vec2 = R.c(10, 20, 30)</code></pre>
564
+ <p>In the next block, variables ‘a’, ‘vec’ and ‘vec2’ are used and printed.</p>
565
+ <pre class="ruby"><code>puts a
566
+ puts vec * vec2</code></pre>
567
+ <pre><code>## 1
568
+ ## 2
569
+ ## 3
570
+ ## [1] 10 40 90</code></pre>
571
+ <p>Note that ‘a’ is a standard Ruby Array and ‘vec’ and ‘vec2’ are vectors that behave accordingly, where multiplication works as expected.</p>
572
+ </div>
573
+ <div id="accessing-r-from-ruby" class="section level3">
574
+ <h3>Accessing R from Ruby</h3>
575
+ <p>One of the nice aspects of Galaaz on GraalVM, is that variables and functions defined in R, can be easily accessed from Ruby. This next chunk, reads data from R and uses the ‘reduce_sum’ function defined previously. To access an R variable from Ruby the ‘~’ function should be applied to the Ruby symbol representing the R variable. Since the R variable is called ‘r_vec’, in Ruby, the symbol to acess it is ‘:r_vec’ and thus ‘~:r_vec’ retrieves the value of the variable.</p>
576
+ <pre class="ruby"><code>puts ~:r_vec</code></pre>
577
+ <pre><code>## [1] 1 2 3 4 5</code></pre>
578
+ <p>In order to call an R function, the ‘R.’ module is used as follows</p>
579
+ <pre class="ruby"><code>puts R.reduce_sum(~:r_vec)</code></pre>
580
+ <pre><code>## [1] 15</code></pre>
581
+ </div>
582
+ <div id="ruby-plotting" class="section level3">
583
+ <h3>Ruby Plotting</h3>
584
+ <p>We have seen an example of plotting with R. Plotting with Ruby does not require anything different from plotting with R. In the following example, we plot a diverging bar graph using the ‘mtcars’ dataframe from R. This data was extracted from the 1974 Motor Trend US magazine, and comprises fuel consumption and 10 aspects of automobile design and performance for 32 automobiles (1973–74 models). The ten aspects are:</p>
585
+ <ul>
586
+ <li>mpg: Miles/(US) gallon</li>
587
+ <li>cyl: Number of cylinders</li>
588
+ <li>disp: Displacement (cu.in.)</li>
589
+ <li>hp: Gross horsepower</li>
590
+ <li>drat: Rear axle ratio</li>
591
+ <li>wt: Weight (1000 lbs)</li>
592
+ <li>qsec: 1/4 mile time</li>
593
+ <li>vs: Engine (0 = V-shaped, 1 = straight)</li>
594
+ <li>am: Transmission (0 = automatic, 1 = manual)</li>
595
+ <li>gear: Number of forward gears</li>
596
+ <li>carb: Number of carburetors</li>
597
+ </ul>
598
+ <pre class="ruby"><code># copy the R variable :mtcars to the Ruby mtcars variable
342
599
  mtcars = ~:mtcars
600
+
601
+ # create a new column 'car_name' to store the car names so that it can be
602
+ # used for plotting. The 'rownames' of the data frame cannot be used as
603
+ # data for plotting
343
604
  mtcars.car_name = R.rownames(:mtcars)
344
- # compute normalized mpg
605
+
606
+ # compute normalized mpg and add it to a new column called mpg_z
607
+ # Note that the mean value for mpg can be obtained by calling the 'mean'
608
+ # function on the vector 'mtcars.mpg'. The same with the standard
609
+ # deviation 'sd'. The vector is then rounded to two digits with 'round 2'
345
610
  mtcars.mpg_z = ((mtcars.mpg - mtcars.mpg.mean)/mtcars.mpg.sd).round 2
346
- mtcars.mpg_type = mtcars.mpg_z &lt; 0 ? &quot;below&quot; : &quot;above&quot;
611
+
612
+ # create a new column 'mpg_type'. Function 'ifelse' is a vectorized function
613
+ # that looks at every element of the mpg_z vector and if the value is below
614
+ # 0, returns 'below', otherwise returns 'above'
615
+ mtcars.mpg_type = (mtcars.mpg_z &lt; 0).ifelse(&quot;below&quot;, &quot;above&quot;)
616
+
617
+ # order the mtcar data set by the mpg_z vector from smaler to larger values
347
618
  mtcars = mtcars[mtcars.mpg_z.order, :all]
348
- # convert to factor to retain sorted order in plot
619
+
620
+ # convert the car_name column to a factor to retain sorted order in plot
349
621
  mtcars.car_name = mtcars.car_name.factor levels: mtcars.car_name
350
622
 
351
- # Diverging Barcharts
352
- gg = mtcars.ggplot(E.aes(x: :car_name, y: :mpg_z, label: :mpg_z)) +
353
- R.geom_bar(E.aes(fill: :mpg_type), stat: 'identity', width: 0.5) +
354
- R.scale_fill_manual(name: &quot;Mileage&quot;,
355
- labels: R.c(&quot;Above Average&quot;, &quot;Below Average&quot;),
356
- values: R.c(&quot;above&quot;: &quot;#00ba38&quot;, &quot;below&quot;: &quot;#f8766d&quot;)) +
357
- R.labs(subtitle: &quot;Normalised mileage from 'mtcars'&quot;,
623
+ # let's look at the first records of the final data frame
624
+ puts mtcars.head</code></pre>
625
+ <pre><code>## mpg cyl disp hp drat wt qsec vs am gear carb
626
+ ## Cadillac Fleetwood 10.4 8 472 205 2.93 5.250 17.98 0 0 3 4
627
+ ## Lincoln Continental 10.4 8 460 215 3.00 5.424 17.82 0 0 3 4
628
+ ## Camaro Z28 13.3 8 350 245 3.73 3.840 15.41 0 0 3 4
629
+ ## Duster 360 14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
630
+ ## Chrysler Imperial 14.7 8 440 230 3.23 5.345 17.42 0 0 3 4
631
+ ## Maserati Bora 15.0 8 301 335 3.54 3.570 14.60 0 1 5 8
632
+ ## car_name mpg_z mpg_type
633
+ ## Cadillac Fleetwood Cadillac Fleetwood -1.61 below
634
+ ## Lincoln Continental Lincoln Continental -1.61 below
635
+ ## Camaro Z28 Camaro Z28 -1.13 below
636
+ ## Duster 360 Duster 360 -0.96 below
637
+ ## Chrysler Imperial Chrysler Imperial -0.89 below
638
+ ## Maserati Bora Maserati Bora -0.84 below</code></pre>
639
+ <pre class="ruby"><code>require 'ggplot'
640
+
641
+ puts mtcars.ggplot(E.aes(x: :car_name, y: :mpg_z, label: :mpg_z)) +
642
+ R.geom_bar(E.aes(fill: :mpg_type), stat: 'identity', width: 0.5) +
643
+ R.scale_fill_manual(name: 'Mileage',
644
+ labels: R.c('Above Average', 'Below Average'),
645
+ values: R.c('above': '#00ba38', 'below': '#f8766d')) +
646
+ R.labs(subtitle: &quot;Normalised mileage from 'mtcars'&quot;,
358
647
  title: &quot;Diverging Bars&quot;) +
359
- R.coord_flip()
648
+ R.coord_flip</code></pre>
649
+ <p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAo8AAAHUCAIAAADUU1WFAABnF0lEQVR42uydCVhcRd7u1Zg91/mMozOZROM646eO+hnHGceZR/0+dZw4CYQlQENYZcxOIBtmYwjKQEcSyC5hy2IIiQQUAtlINEoWAQNJrkgikichIQmQCNIhLdv93665dc+cPnX6NHt3v+/Dw1OnurpOVVd3/fpfp87bt3VAEARBENS/dRteAgiCIAgCrSEIgiAIAq0hCIIgCLSGIAiCIAi0hiAIgiAItIYgCIIg0BqCIAiCINAagiAIgkBrCIIgCIJAa6g/vgNMQksgCIJAa6hvyMc0aNCg0aNH/+Uvf0lISGhsbHRkWstelscffzw2NratrQ1vGAiCQGuoj2kt1ahRo4qKivCySLVgwQK8YSAIAq2hPo5Tb926VVVVlZaWRqEkZd533311dXV4WQwGg16vp8Of//zneMNAEARaQ32MJa6mpqann36a8v/xj3+Yl6ytrR08ePCAAQNqampkz/rZz35GjP/pp59YztatW19++WXKHDRo0COPPDJ//vwffvhBVuGPP/74zjvvjBw5kipk+d99992ECROGDx9+1113BQYGNjY2yhqpeEjFpkyZMmzYsHvuuWfhwoXt7e28gMUKLb4sRqORDocMGSIts3///rfeeot6N3To0BdffPHgwYPmNch6R4dz58596KGHBg4cSI157bXXcnJy8CaEIAi0hjpDa1JmZibl//73v1cs6enpSemVK1dKn5KUlESZ8+bNozTBUqfTmS8mP/nkkw0NDdIKJ06cyB9lXwVGjRolfQqBVgutnZ2dpc9as2YNe1RLheovy82bN+Pi4uiQ2GxehosAXFxcLHtU1jt3d3fz1wRvQgiCQGuok7S+du0a5d99992KJQ8dOkTp5557TvqU559/njLLy8spvWnTJkpTEJmdnU3xNEXbRLKXXnqJMinwlVb4wAMPFBQUUPDKMgn2lPnoo4+eOHGCMuk/BeVaaE1fLM6dO2cwGGbNmkWH1BjtFYpeFulGM19fX3pNpGXc3NxKSkqozosXL7KvL/RfVoOsdxSds28S9JWFNcbFxQVvQgiCQGuok7RuaWmh/DvvvFNU8rHHHqPDb775hh0St+jwj3/8IzskdtLhV199Ja2zurqaMumJ0grz8vKkZX7zm99Q5v79+3nOvn37tND65MmT7PDq1at0OHz4cO0VWqQ1afTo0evWrROVv3HjBpW5//77ZTXIekfwZjH6P/7xj88//xybzCEIAq2hLtGaMW/kyJGikmzj1eLFi9nh3//+dzpMSkpih8OGDRPtNh84cKC0QoqGpecdPHgwZd68eZPnUAEttG5tbVUsoKVC9ZeFvriUl5dPmjRJuvhPp1uxYsWzzz4r7SmF4LIaZL0jeN999928PEX8paWleBNCEARaQ52k9ccff0z5f/jDH0Qlr127RnB66KGH2tvbGxsbR5j0448/skeHDh16m1gqp+40rUWd6jqtmerq6ihnzJgx7DA0NFSlayovLJ09Ozubnk5VSVfsIQiCQGvIOlo3NTX99re/pfzIyEiVkpMnT6acL774YsOGDZQIDAzkD7Fr2KdPn7b21Gzh+sCBAzxn//79XaG1lgq105rYzw5HjhxJhzt27Pjhhx/o+0pDQ4NGWnPV1NRQgQEDBki3r0MQBIHWkAUsGY3G8+fPb968WfF+a3P8HDx4kHLeeeedZ599lhKFhYX8oZSUFLbHimq7cOFCS0vLrVu3KioqEhMTX3zxRRWezZ07l13bLioq+umnn+g/u0DeaVprqVD9ZWltbf3222/ZSjjfWMcWDyhKpn5VVlZ6eHhoofWbb75J3xXoy9CPP/5IL4X5XWEQBEGgNSTEkrkItDIvM3P8UFD46KOPsqVmArysZrY329qV8KtXr/7yl7+UFv7b3/6mvt9NndZaKtT4stBT8vPzWQEGb1mdFmltXqdOp8ObEIIg0BqygtYUL44ZM2b8+PHr16/nV6DV8RMTE8Py9Xq9eeUUfLu5uY0ePXrgwIFU+ZNPPjl9+vQTJ06oVEg6e/bsW2+9NWzYsLvuuisgIIAiVyp27733do7WWipUf1kGDBgwatQoV1fX48eP8wK1tbUuLi5U53/8x3/4+/v/8MMPWmh9+PBhqueee+4h8D/00EPh4eHSC+oQBEGgNWSrYovqr7zySr+tEIIgCLSGHE5OTk6FhYW3bt2igHXbtm0UvEq9yfpDhRAEQaA15PBvNTONGzeO24H1hwohCIJAa8jRtWfPntdff136WyDcWryfVAhBEARaQxAEQRAEWkMQBEEQaA1BEARBEGgNQRAEQRBoDUEQBEGgNQRBEARBoDUEQRAEgdYQBEEQBIHWEARBEASB1hAEQRAEWkMQBEEQBFpDEARBEARa2/Wg3nabq6urYn7ftqonmtEttfVQ2zqt9PT0X/ziF+yHxXp/gPr5exsfcAi0huyK1hkZGaC1jdJ6zJgxhYWFNgHCXn7FQGsItIbsitZXrlz5zW9+c+3atX5I6/5cbT+Bwe23397e3g5ag9YQBFrbOa3p/+bNm93d3UUz3caNGx955JGBAwfS/8TERGmZjz766IUXXhg+fPgdd9zBc55//vmhQ4dS5muvvXb69Om8vLw//vGPw4YNo5xJkyZJvxbQF4Vp06ZR4fvuu2/69OkGg0EUv37zzTd//etf77rrrkGDBj333HM7duzglXzyySfPPvss5Y8dOzYpKUnai5SUlIcffpha/uijj1IvRNO3Vc1WjK1V2iDqI+nDDz988MEHFZunUqGs5VyKI2Jx+LQPlmiBQWMlt/27pD0dN27c4MGDH3jgAWlPVd4bsj6K3hugNQRaQ/ZGa9Kbb7758ccfm+dv2bKFiHLs2DGj0Xj06FGCB82VvMwTTzxRWFj4008/8Zynnnrqiy++oMJ1dXXvvPPOyJEjn3nmmSNHjty6dYvluLi48LOMHj06LS2tubm5urrax8dn1qxZIiI+/vjja9asaWhooJpPnDjBK9m7d+/dd9+9e/duqr+srOzXv/51dnY2e4gyiU9UmJ5C7X/ooYdUaK292eZtU2mDSh8JKgRp1jz6T03VWKFKBGk+IurDZ9VgdeNLx5WbmztmzJgDBw5Q4XPnzk2ZMkXLe0PWR9F7A4JAa8gOaX3hwgWCR21trSyf4h4KlXj5PXv2/O53v+NlvvrqK1ltZ86c4YfXr1+nnP/9v/+3NGfEiBGKLWlsbBw1apSIiEOGDKFZ2/xZf/7zn4lq/LCoqOjpp59m6T/84Q/79u3jD+Xn56vQWnuzzdum0gaVPlJ0uH//fv4QNbUTFZrTWjYi6sPX6cHq4kvH9eKLL+bk5Fh8l8reG7I+it4bEARaQ3ZIa9KGDRs8PDzMMXnz5k1exmAwUA4v09raKqtNdg1VMYclrl69GhgYSCHUgAED2OooX7w1J2JoaOh99903bdo0ircuXrzIaxs2bJhsiZVXMnToUFnLVWitvdnmCZU2qPTR/IXVUqFFWstGRH34tPda5eydeOm4aIyklwa41N8bsj6K3hsQBFpD9klrmmRffvllFtVppLVKbRZzXn311dmzZ1dUVDQ3N9PhTz/9pEJEUklJiV6vnzx58siRI//5z3/y5v3444+KXbOK1tpzFON+URtU+qhCa5UKLdJa9mi3D1+3vHQWaa3lvSGV4nsDgkBryD5pTTp37txDDz1UX18vXQnPz8/nBfLy8qRLqV2ZuwcOHMjmYqb9+/er05rr+++/p+iTpV966aXPPvtMsWtWrYR3hdYqbVDp4wsvvHDgwAHFh1QqtJbW3T58XXnpzLevv/jii7m5uVa9bupNkr43IAi0huyW1qQPPvhAp9NJd5k9/PDDx48fp/iG/hPLpduUujJ3E0iWLVtG3wwo+Pv0009HjRqlQsQ333yTpuympiYKOhMTE5988kmWf/Dgweeff/7o0aO3bt2iR+lw/Pjx7KFdu3axbVy85T1Ea5U2qPRxx44djz32WFFRETWP/lNaS4XW0rrbh68rL92YMWMOHTokBTa9Jvfff39BQYHRaJTuMtPy3uASvTcgCLSG7JnWra2tv//972XXsx955JE777zT/BagrszdNDu//vrrQ4YMGTx48DPPPLN582YVIu7Zs+fll1+mknfddddbb71VUVHBK6Qw9NVXXx0+fPjQoUNfeeUVaayWlJQkukWqG2mt0gaVPnaY7q0aO3Ysa97atWsHDRqkpVNW0brbh68rL93WrVtHjx5NEba0TGZmJrtXjUYqOTlZ+3uDS+W9AUGgNQRB3amSkpLHH38crwMEQaA1BPUv+fj4nD17tqWl5eTJk+PGjdPr9XhNIAgCrSGofyktLe3RRx+98847x44dGxkZ2dbWhtcEgiDQGoIgCIJAawiCIAiCQGsIgiAIgkBrCIIgCAKtIQiCIAgCrSEIgiAItIYgCIIgCLSGekUnT578BwRBDqCqqirMeKA1ZKv6+9///sYbb/y9a3r77beDg4P/3rsKDAwMCgrq5ZM6SE8xoPbX01deeYWAjRkPtIb6WBMmTJAltNO665/hW7du/fTTT73c5R9++EH7zz93lxykpxhQ++tpt3zSIdC6x0lmru5lpFUqKiqaPXv2pEmT6Ev9wYMHQWtM7qA1BhS0hkDrrsK1eyssLy/39fUtKSlpaWmpqamJj48HrTG5g9YYUNAaAq2FcDUajWvWrPEwae3atXRIHyFvb++GhgZWoLW11cfHhz5a5iVlITsrT/SNiopyd3d3cXGJiIigJ5q3gQoUFBSY5yuegp0lOzs7ICBg4sSJ6sVkCS2NAa1tpae37f8D/vAn+wOtIUehdXJycmRkJE2FN27cIJ6lpKRQ5saNG3fu3MkKfP3111RAVNK8wunTp5eVlRFBDQZDYmJiXFyceRt0Op0iOFVOodfr+VMstoQntDQGtAat8QdaQ6B1f6e1n5/fpUuXWLq6utrf35+FpIGBgRRVU3r9+vVHjhwRlVRfdqZpneJy83wnJyfFn0RUOUV9fb2WYipNMm8Mv6njjTfeWLx48Y9dE+GkoaHhx94VvSzXr1/v5ZP2VU9BJvyZ/1n1LgKtQWsbprUUnIRnZ2dnlo6Jifn888/b29unTp3KlppFJWUVlpeXL1y40N3dnS2Ps7VrjbG1xlNYLMYT6o2R3texaNGiH7omoibF+j/0rurq6ghjvXzSvuopyIQ/8z+r3kWgNWht27H15cuXeZxKhyxdUVExd+5coh3fAiYqKauQIl2KxQ0GA5Ge/iuGuVFRUYcOHVKMrbWcwmIxntDSGKyEYyUcf1gJh0Dr/k7rpKQkdg2YFBERkZyczB+iqPTdd98tKytTL+np6UnIlMbNx48fp9m8pqZGr9crApK+BBBiT548yfaEJyQkqJ9CY5vNaa2lMaA1aI0/0BoCrfs7rY1GI8FyskmU4PurScS5gIAAikrVS2ZkZLClZnZ47Nix4OBgJyenwMDAnJwcESD5/db0+eH7w0Wn0Nhmc1prbAxojZ5iQB2hp6A1aG2fys/PT01NdYSegtboKQYUtIZAa5uUwWCYOnVqbW0taI0pD7TGgILWEGjdH8W2T+fm5na9HnP7FItGYyoFRJ6pJSUlixcvdnV11el0cXFxfMN5dXX10qVL3UyihPT6OmiNnqKboDUEWkOawNy5Z5kXIBIXFxc3NzfTFLBhwwYiN8sPCQnZvn17k0nbtm2jQ9Aakzu6CVpDoDVkmbvqtqBafnREHec09VCFLE3RNp+GjEYjHYLWtju5Y/8ztnaD1hBo3Qe0FtmCdmWpvMO0lX3+/PksHRMTk56eTvVTbE1BNh2C1qA1/kBrCLSG5FjVeN1aagvaFVpXVlYGBATQf3ZYV1cXFBTEzk4JqX1pB5xH4TyKP9s0EO20QGvQGupMbC2yBe00rU+dOkWoPnPmDM9ZsmTJtm3b+HVrOpR90YbzKJxH8WdzBqKdFmgNWkOdobXIFrRztKaq/Pz8KioqpJkuLi7S69b8ejZWwrESjj+shEOgNaSJ1iJbUJmVqZZqs7KyAgMDL1y4IMuX7QkPDQ0FrUFr/IHWEGgNWUFrkS2ozMpU9lzFTeMTzNTc3Ez5xO9Fixa5mrR48WLcb23TtMYdXOgpaA2B1g4t0Bo9xYCC1hBoDYHWmNxBawwoaA2B1p2Vdq+xzrmSKdYjWs0GrTG5g9YYUNAaAq37C60RW2NyB60xoKA1BFp3iZ1Go3HNmjUeJq1du5b9dLRFhxN+WFxcPGPGDGdn56CgoH379mmntahCSmRnZwcEBLC7sRWbx4plZmb6+Pi4ubklJCTwqUfR3BS0ttGeYuO0Pe3iBq0h0LpLtE5OTo6MjKQP0o0bNwhvKSkp6jSVHXp7excWFtJUfu3atdWrV3cLrfV6PaesSvNYPokS/Ge5ReamoDVojT/QGgKtbZjWfn5+ly5dYunq6mp/f3+raE1BcG5ursqvYouuW6vQWmoXqtK8y5cvszQVoGYoMoabmzLBeRTOo/jrK6/QPnnrgtagtf3Q2snJqa2tjaVbW1udnZ2tovXZs2ejoqJ0Ol1wcPCJEye6JbbW2DzFfJG5Kf+iDedROI/ir0+8QvvkrQtag9Z2FVvzIJWCVzpULEk4pFCVpRsbG2WPtre3FxUV+fr6aqe1qEJZeZXm8XxK8JhbZG6KlXCshOMPK+EQaG3DtE5KSuIXgCMiIpKTk1m+zA00NDQ0PT2dZm36ghwTE8Pr0ev1Fy5caGlpIVp7e3trp7WoQll5UfOoGMX0LH/58uX8urXI3BS0Bq3xB1pDoLUt0Vp2CdloNCYkJEw2iRJ807XMDbSysjIkJITt/c7Ly+P5FMhOnTqV8mfMmFFSUmLxjBYrlPFV1DzpnvBVq1bxfJG5KWiNnqKbDthT0Bq0hvrdIkHvf4YxuYPWGFDQGgKtwVfQGpM7aI2egtYQaK2Ngn1lalZUVDR79uxJkyYFBwcfPHhQVkkX2wlao6cYUNAaAq1B667Sury83NfXt6SkpKWlpaamJj4+vh9+hjG5g9YYUNAaAq37Ha1VTEDz8vKCgoKcnZ1DQkIqKytZPk0HRFk3N7cpU6ZkZmbyerSYg1KBgoICxeZ9//33FG23t7ezHErQYVVVFa+/tbU1KSnJ29vb09MzKysLtLbdyR3bsLEnHLSGQGuraa1iAqrX6+vq6pqbm9PT08PCwlh+amqqtDyvR4s5qE6nU6Q4q2TOnDmlpaUshxKhoaHSdm7ZsmXZsmW1tbVNTU2bNm0CrUFr/IHWEGhth7QW3XOlYgLa2NjIp3VuK0YFpMYmiivh5uagTFILM3Na5+bmxsbGspyYmJg9e/Z0/LsZqvROcangPArnUfzBeRQCre08trbWo1RWnuerm4Nqia0paPbw8CB+UBlK0KHsvHQ60RdtOI/CeRR/cB6FQGt7prVGj1J+KI2tKSiX5ls0B42Kijp06JBK81asWLF79+7MzMwPPvhA9pBKbI2VcKyE4w8r4RBobee0VjEBVSyfkpLCzUHpiTxfizkoxd/0beDkyZNsT3hCQoKs8tLS0qkm8QvY/KGtW7fiujVojT/QGrQGrR2U1iomoKLyq1atcnV19fHxke4J12gOyu+3ps8b3x/OC1NcHmQS3xwu3ROemJhI3wm8vLyys7NBa9ulNe7gQk9Bawi0dmiB1ugpBhS0hkBrCLTG5A5aY0BBawi07mdSvOPLonmZqEB0dPS2bdv4IaUpR3oWlTppOoiJiXFzc/P29t6+fTtojckd3QStMUWD1lCHRjBb9azr16/7+PicP3+e0vSf0pSj8Vx6vX7VqlWNJq1cufLAgQOgNSZ3dBO0hkBrSEhQdatR81hcqv3798+dO7elpSUsLExGXHVa01n4jEDAXrhwIWhtu5M7tmH30PZs0BoCrUFrhUyR1ag6d5csWULAXrp0qVVxvIzWnp6eoDVoDVqD1hBoDXV0WHPdWmo1qs7dU6dOUQH6bxWtY2JiEhISmOkgJbjhGhOcR+E8ChNQh3rrgtagNWRFbC2yGrUYW4eHhxNTLZ5L+i2B5qDo6GhXV9cpU6akp6f7+vrKvmjDeRTOozABdZy3LmgNWkNW0FpkNapC6/3798+fP7+1tXXevHmU1h5bS3XgwAHuS4qVcKyEYyUcK+EQaA1aq9FaZDXq6empaOhNX/wpJr548SKlL1y4YNWe8NWrV9fW1hqNxmPHjgUGBooMw0Fr0Bq0Bq0h0Bq0/rdMkdVoRkYGWx6XPTE6Opoe4ofbt2+X3W+tctc1xdN+fn5ubm5Lly6trKzs0c8waG1nPcWAgtYQaA31L4HW6CkGFLSGQGtHj6pBa0zuoDUGFLSGQGtNEGVyd3ePiIiw+HvPfUJrkUuoRYfR8PBw0aMlJSWLFy92dXXV6XRxcXHMiQW0Rk/RTdAaAq37dcjb0NCwZcuW0NDQfkhrdZdQUc0FBQXz588XPbp06dLi4uLm5maaGjZs2GB+AxhojZ5iQEFrCLTud7TuMP3ONDcJofSaNWs8TFq7dq30N6qzs7MDAgLYzdAEvBkzZtCzgoKC9u3bx8q0trYmJSVRHOzp6ZmVlcWfmJeXR8WocEhICN/Y1dbWtnnzZh8fHwpzico3b940b6S6S6gij6k82+mt5VsCTUkuLi6gte1O7o5jdQJag9YQYuuGrVu38tg6OTk5MjKSPjY3btyIiIhISUnh5YmpfN2YkFxYWEif52vXrq1evZplUoy+bNmy2trapqamTZs2SZ9YV1dH4Wx6enpYWBjL37FjB4W5VJg4HR8fv379eou0lrmEKvJ43bp1u3fv1hjTHz9+nKJw0Bq0Bq1Bawi07r+05tetiZrs3mWSn5/fpUuXWJoiVH9/f16+vr6eP52C7NzcXGKttE7KNL/+TU8k0PIpgAfxFG3zwvTNYMqUKeaNVHcJNedxRUUF0be9vV0LrSnKpwbLbuKC8yicR/vhn+MMKJxHIdBabSVcKicnp7a2Nr6yzQEpK3/27NmoqCidThccHHzixAn+XHqK+on4IdXsZNLEiROlbqNSqbuEmneBUM2/dkgfNd+VdurUKUL1mTNnzL9ow3kUzqP97c9xBhTOoxBorZXWFFtfvnyZx9Z0qFKeotiioiIOUVFsrXhIhenDqb3B5i6hKn7g6pvGjxw5Qv2iQLyn18ewEo6VcKyEYyUcAq17hNZJSUnsujUpIiIiOTlZsbxer79w4UJLSwvR2tvbm2Vu3bpV8bq14nl37txJJ6qpqaFw/Pz581SheWPUXULV17pFj2ZlZVFV1Phe+AyD1qA1aA1aQ6B1j9Ca0JiQkDDZJEpI94TLwtOpU6c6OzvPmDGjpKSEr5wnJibqdDovL6/s7Gx1WlNcvmvXLrZXfObMmVShYjyt6BKqJYBWyZepubkZtEZP0U3QGgKtIdsTaI2eYkBBawi0hkBrTO6gNQYUtIZA697ShAkT9u7dK80pLi7udm9wi3ahMqvR9vb21NRUT09PLy+vzZs3s3u6Ov7fMrizs7Ofn19sbCx+gwuTO7oJWoPWoLWj0Do0NJTf9EVatGhRt9Na3S7U3Go0Pz9/3rx59SZRgrutsTIEb8rPyckhlp87dw60xuSOboLWEGht/7ROTk4+fPgwOywqKlq/fj0Hp8heVOZjqmhZqjKPSO1CFa1GCd5lZWUsTYkFCxZIac2Vm5v73nvvgda2O7nb0L5uDChoDYHWfUzrK1euzJw5k602h4WFXbx4kUNRZC8q8zFVtCwVSWYXqmg16uHhYTAYWJoS3LJURuvr16/z289Aa9AatAatIdDanmlN/6OiogoLC0+cOBERESGFoshe1NzHVONPdsrsQkVWoxSy82vVlHByclKktdSsjQnOo3Ae7bl7pjGgcB6FQOs+pnVpaWlISMicOXPYvdcW7UVl1FS0LDWXuV2oyGpUe2zt4+Mj+6IN51E4j/bEHwYUzqMQaN33tCZNN0kW5orsRWXU1BJbK9qFiqxGtV+3jo6Oxko4VsKxEo6VcAi0dhRaK2aK7EVlz1K0LJVKi12otM68vDwCNtsTTgnzPeEUOhCqdTqd6CYu0Bq0Bq1Bawi0dhRai+xFza8fm1uWqsfQ5nahivdbk9LS0mT3Wzs5Ofn6+sbGxlZVVfXoZxi0trOeYkBBawi0hvqXQGv0FAMKWkOgNQRaY3IHrTGgoDUEWvcD9a0paVFRUXh4uIuLC+Xr9Xq+2U1kSgpao6foJmgNgdYOSus+NCWlcx09erSpqenmzZsZGRncUEVkSgpao6foJmgNgdYOSuu+NSXlMhqNdBaWFt3cBVrbYk97eVM3BhS0hkBr+6R135qSMlHYvWvXrsjISHYoMk4BrUFr0Bq0hkBrB6V1R9+ZkvLaSBTBX758meWITEmZ4DwK51EV61AMKJxHIdDabmndV6akXBRAUxwfHh6uJbaG8yicR1WsQzGgcB6FQGu7pXVHH5mSSmU0Gvn1bFy3xko4VsLx1sVKOGgNCbkry+xpU9KVK1dSJlVOUUJycjIFyixfZEoKWoPWoDVoDYHWoLU8s6dNSb/88stZs2ZR5T4+PqtWreLb1kSmpKA1eopugtYQaA3ZmEBr9BQDClpDoDUEWmNyB60xoKA1BFr3jNhSs7Ozs5+fX2xsrOjnJmVP6YUmcXl4eMjyZeXhPIrJHd1ET0Fr0Nr+ac2AV19fn5OTQ8A7d+5c39JaqsLCwpSUFPWzw3kUkzu6iZ6C1qC1Q9CaKzc397333mPpmpqaqKgod3d3FxeXiIgItqtLGvWyYsXFxTNmzKDoPCgoiJNSVi0/pEReXh7biRYSEmIxlJ87d67srjBzWuMOLnua3LEnHLQGrSHQ2jKtr1+/7u3tzdLTp08n+BmNRoPBkJiYGBcXp/gUKk8RME0E165dW716tUVas5/Pam5uTk9PDwsLU2nbiRMnEhISLEb2cB4FrUFrvHVBa9DasWjd2tpKUa/iR93Hx0fxKQEBARSR19bWqlQrpXVjYyOvU/Fc0sDa/K5rc1rDeRTOo3AexVsXzqOgtcPF1pzK5eXlCxcudHd3Z+veIifRs2fPRkVF6XS64OBgioYt0lodvVzFxcVUrcUGd8B5FM6jcB7FWxfOo6C1o9GaouTo6GiW9vf3P3LkCPGPAlb6LyIuD2qLiop8fX3ZIQXNFDqzNAXTnaD1/Pnzv/nmGy20xnVrrIRjJRxvXayEg9YOQWtiLX31JlRTiMx3flH6+PHj9AmvqanR6/UckxS8So2+6aELFy60tLQQrfk179DQ0PT0dJog6Mt1TEyMtbQuLS01/6FM0VPgPApag9Z464LWoLX905rk5OREYXFsbGxVVRV/6NixY8HBwfRQYGBgTk4Ox2RGRgZbHmeHFH9PnTqVgukZM2awX+XqMP3YZUhICNsoTjS1ltbh4eH0RUGxqeZ3XcN5FJM7uomegtagNWQnAq3RUwwoaA2B1hBojckdtMaAgtYQaK2qCUrqrpo78ayioqLZs2dPmjQpODj44MGDoDUmd9AaAwpaQ6B1V+HavRWWl5f7+vqWlJS0tLTU1NTEx8eD1pjcQWsMKGgNgdZCuBqNxjVr1niYtHbtWjqkD4+3t3dDQwMr0Nra6uPjQx8q85IdSj6jinakMlGBgoIC83zFU7CzZGdnBwQEsFu6VYopupZqaRJobSs97coGbwwoegpag9a2Suvk5OTIyEj6zNy4cYNIxn4hY+PGjTt37mQFvv76ayogKmleociOVCqdTqeITJVT6PV6/hT1YuaupVqaBFqD1hhQ0BoCrfsvrf38/C5dusTS1dXV/v7+LBgNDAykqJrS69evP3LkiKhkh+pKuNSOVConJ6e2tjbzfJVT1NfXaylm0bXUvElwHnUQ51EMKHoK51HQ2oZpLQWn1AM8Jibm888/b29vnzp1KltqFpWUVSiyI9USW2s8hcZi/FC9SXAedRDnUQwoegrnUdDatmPry5cv8ziVDlm6oqJi7ty5xDm+BUxUUlahyI5UqqioqEOHDinG1lpOobEYP9TSJKyEYyUcA4qVcAi07r+0TkpKYteASREREcnJyfwhikffffdd7rAtKinzGRXZkcrib0LsyZMn2Z5w/quXolNobLOI1lqaBFqD1hhQ0BoCrfsvrY1GI8FyskmU4PurSUS4gIAA7tMpKinzGRXZkcrE77emTw7fHy46hcY2i2itsUmgNXqKAQWtIdDa9pSfn5+amuo4wwlao6cYUNAaAq1tTAaDYerUqbW1td0Yx4PWmNxBawwoaA2B1t0mtnE6NzeX5+zduzc2Nta8ZExMDD3UQ7S26JAaHh4ufbSkpGTx4sWurq46nS4uLo5vO9douQpao6cYUNAaAq1tW0aj0dfX9+rVq9JMOqRM6aXunoitRZUUFBTMnz9f+ujSpUuLi4ubm5tpCtiwYQOR26pmgNboKQYUtIZAa5tXenr6pk2bpDmJiYmU2aFqBfr9998HBwfzrWqUoMOqqirRUzTSmj7hgYGB1dXVIhLT1OPi4gJaY3JHN9FT0BpyLFo3NDRMmTLFYDCww6amJh8fH2Ynrm5KOmfOnNLSUpZDidDQUJWnaKT1unXrdu/erULi48ePU+QNWtvf5N6bt29hQEFrCLS2Sa1fvz4zM5OlKUGHLK1uSpqbm8uvecfExOzZs0flKVpoXVFRQSRm8boiiSsrKwMCAviveqhft4bzqCM4j2JA0VM4j4LWDqTLly8HBQW1mhQYGMgNxdStQCkK9/DwoImApgNK0KHKU7TQmlB98eJF0aOnTp0iVJ85c0Y9Opd+0YbzqN07j2JA0VM4j4LWjqXo6OjDJlGCZ1q0Al2xYsXu3bspHP/ggw/Un6KF1iqx8pEjR6gqCr4trqVjJRwr4RhQrIRDoLXdqry8PMQkSvBMi1agpaWlU03iF7BVHE8t0lr0aFZWFkX8Fy5csKoG0Bq0xoCC1hBobYeab5I0x6IVaHt7e5BJFn1MVWJoi7Q2j7mbm5s7cL81aA1ao6egNWgN2Y1Aa/QUAwpaQ6A1BFpjcgetMaCgNQRaa5Dijq1ePqO5ZAaisqeTnJ2d/fz8YmNj+U1ZnTsRaI3JHd1ET0Fr0Bq07gxEzQ1EzZ/e3t5eX1+fk5Pj5eV17tw5xNaY3NFN9BS0hhyU1iruodnZ2QEBARMnTmSHeXl5QUFBFO+GhITwYLetrW3z5s0+Pj6urq56vf7mzZsd/769S7E9Fg1EZfm5ubnvvfeeqGEil1PFtoHW6Cm6CVpDoLXt0VrFPZQIJ/09Kzqsq6trbm5OT08PCwtj+Tt27Fi6dGltbS2xMD4+ntucqcfWFg1EZfnXr1/39vYWNaxD4HIqahtobYs9xZ5w0Bq0hhyC1qLbmVTcQ+vr66U1NDY28o839yCjaJuexdLE+ylTpliktUUDUfN8mVGarGEdApdTUduY4DwK51EMKJxHIdDaZmJrdfdQUQ38kMo7mTRx4kT289gWaa1uICqKrX18fFRaouhyKmob/6IN51E4j2JA4TwKgda2QWuL7qHqhwEBAfTB03JGlUDf4tMpdOaOp6KWmLucitqGlXCshGNAsRIOgdY2RmuL7qHqhzt37qSn19TUUFx+/vx5vV7P8j09PfkqtFUNk+a3t7fTF39CtU6nk/6ylmIN5i6noraB1qA1BhS0hkBrG6O1RfdQ9UMC6q5du9he8ZkzZx45coTlZ2RkuLu7W7yPS/1+aycnJ19f39jY2KqqKi0tkbmcitoGWoPWGFDQGgKtIRsTaI2eYkBBawi0tgf1tJUKaI3JHbTGgILWkGPRmsi6d+9eaU5xcXEXcWvV0/neMXd39yVLlrAfsoyOjt62bRsvQ2np72R3iF1IZ86cyX+1uqWlxcvLq7W1lR1SPj0KWmNyRzfRU9Aasklah4aG8puySIsWLeplWrOEwWDYsWNHSEhIx/+7Bev8+fOUpv+Uphz+FBUX0l27dn344Ycs/e2331IZDu+NGzd+/PHHoDUmd3QTPQWtIZukdXJy8uHDh9lhUVHR+vXrOQhramqioqIo6nVxcYmIiGCOYOb3U9GnNz4+3s3NbcqUKZmZmepPV0E71TNp0iSW3r9//9y5cyk+DgsLO3DgAC+j7kJ69epVagOLp7Oysqg2+t9hujWc8q9du6bSKqPRuGrVKvNegNboKboJWkOgdd/T+sqVKzNnzmRbowmNFy9e5KCaPn16WVkZYYwC38TExLi4OOlzCagEaUqkpqZK7Ug1Pl0xtiZC84eWLFlCh0uXLpWWt+hCSmE3fefoMC2n0zcPtoROOeHh4eqtom8t7733Hrs5jXAOWtv05N6jO8AxoKA1BFr3Aa3pP8GpsLDwxIkTxFoRCOlTyg3CSOXl5cQ/9rn19/eXWqZoebq0AVy+vr4UHPOHTp06RZn0n+docSHds2cPu1Xaz8+vtraWeaNSTn5+vnqrqCSF3SxN3ZHVD+dR+3MehR8netqjzqO33Xbb+PHjFR+ifHqUF5MlINBaSOvS0tKQkJA5c+aUlJRIQUhIXrhwIbsTWmrGSR8eKs+dv2R2pBafbt4AAjCR8t133z169Kg0tqYvBIRGadxs0YWUphIPD4/KykoWpoeFhVGacrhvuahVol7wL9pwHrUz51H4caKnPeo8SvQdPXr0yZMnZfmUQ/mgNWjdGVqz9WGSLGylcPPIkSMGg4Hy6T+/Sk0Q/eabb3gl0tj60qVL6k8XNYBEoTCF1+ynKvfv309sJmrOmzeP0uaBuMovbNJnjBifmprKVukpHRUVJW2tYqsoFleJrbESjpVwDChWwq2l9bp16ygwkOW7ubmtX7/enM2gNWitidaKmTqd7vjx4/ThJIzp9XqWHx8fL1tVTklJIRyyL6SRkZHqT1dvQExMDFVO398J2yyMvnDhgmxPuHpsTTp8+DA9ytYJ2A1pUmMyUauSk5Pff//9BpNw3Rq0xoCC1l2ntdFofPjhh7/99lueWV5eTjn0GqrH1p988smzzz47aNCgsWPHJiUlSau9cuXKtGnThg4det9991GIRSEHf+jDDz988MEHBw4c+Oijj27cuFFjhZA90PrYsWPBwcFOTk6BgYE5OTks3zy6ZbupXV1dCavS3dSKT1dvwNdffz1nzpzo6OiMjAyeuX37dtn91uq0bm5u9vDwoP8s7eXlxR1SVVpF01BcXBzrxc6dO/nPi4HWoDUGFLTuHK1ZGMB//YhEcQiFN4qQ5om9e/fefffdu3fvple7rKzs17/+dXZ2Nq9h9OjRaWlpNLNVV1fTZDVr1iyWv2PHDoL0iRMnaLqj/4888ojGCiHboDWkKArr3377bdAakzu6CVp3kdatra1PPPEE+/EC+k9pdoupCq3//Oc/sztfmIqKip5++mnFUzQ2No4aNYqlX3jhBX7RkLRv375OVAhaQ7ahTZs20aRw/fr1yMhI0WIRaI2eYkBBa+20Jn300UfTpk2jxNSpU7dv3y6CNE8MGzbstn/XHXfcwR66evVqYGAghdcDBgyQPTRkyBC26YfJYDBoqRACrXtKPWpC/umnn3p7e7u7u3/wwQdsIR20Rk/RTdC6i7Rua2sbN25ccXHx888/z288UaE1cVfU31dffXX27NkVFRVsgpJe/1ahtUqFUDfQevfu3b/97W/5N6Dx48fv2bPH5shqTybkoDV6igEFrTtBa1JmZubIkSOly9EqtH7ppZc+++wzxToHDhwoDST279/Pn/XCCy9IbR+lD6lUCHWV1omJib/+9a+Lior4y03D8D//8z82R2t7MiEHrdFTDCho3Tlaqzxqnjh48CBF4UePHqVXu6mpiQ65ywrF6MuWLauvr6cw+tNPPx01ahR/Fk1xjz32GFGDBoj+U1pLhVBXaf3AAw+UlZVJx4/erMOGDbM5WtuTCTlobUM9xZ5w0Np2aU2iUPjVV18dPnz40KFDX3nlldzcXJZ/7ty5119/fciQIYMHD37mmWc2b94sfdbGjRvHjh3L7uBau3btoEGDLFYIdZXW9HLTp0I6fs3NzSNGjLA5WtuZCTloDVpjQEFrm1BJScnjjz8OAPc4relL0yeffCKl9Zdffvnf//3fNkfrDnsxIYdPOHzCMaDwCe/nomnw7NmzLS0tJ0+eHDduHPvFBKhnaU0R3siRI7OysojW9L45fPgwvfQ2t03AnkzI4RMOn3AMKHzC+7nS0tIeffTRO++8c+zYsZGRkdI9Q1BP0ZqUl5f35z//ediwYUOGDHnppZcOHjxocz23SxNyrIRjJRwDipVwCLS2K9mlCTloDVpjQEFrCLT+l65evTpp0qThw4fLDGjsidY2akIOWqOnGFDQGgKt/yVnZ+d33nnHPOaD+lygNXqKAQWtIdD6Xxo2bBjfZgWB1pjcQWsMKGgN9VNaS3/ksf9Ly/6sbj+jqBnOzs5+fn6xsbGVlZXq5UFrTO7oJnoKWkOdp/WLL7745Zdf2hat+08z2tvb6+vrc3JyvLy8zp07h9gakzu6iZ6C1lCP0DovL++//uu/vvnmG3bXk43Suq2tbfPmzT4+Pq6urnq9nv8+DBXOzs4OCAhgN0nLDkWWoubPstiM3Nzc9957T/YQJejlDQoKohA8JCSEx99Go3HNmjUeJq1du1a0tgFa98+e3lowS/YHhqGnoDXU47Q+derUyJEjbzOTbdF6x44dS5cura2tJU7Hx8evX7+eFyZ4SzEsPRRZipo/y2Izrl+/7u3tbU5rqqeurq65uTk9PT0sLIzlJycnSy1OU1JSQGvQGgMKWkOgtZpeffVV29oTrnjdmuLX6upqliYETpkyhReur6+XPld6KJsauKWo+bMs0rq1tZUCaHNaNzY28vp5AT8/v0uXLrE0Ndvf319aFZxH+3lPzWkNP070tG+dR7Xc9N+JPzC1f9Ha5vaEK7KTQOhk0sSJE6XmoLLCskORpaj6s0SxtRT26vXILE45xfkXbTiP9ueemtMafpzoad86j4LWDkHrIUOG2NyecPPMgIAAxe8c6twVWYp2gta5ubnc+cRiPRRbS38+hA6xEo6VcAwoVsJBa9BaTc8+++wXX3xh67TeuXNnZGRkTU0Nharnz5/nPwijzl2Rpah2WhPmKQIgVFNVfBOZxXqSkpLYdWtSREREcnIyaA1aY0BBa9AatFbTtm3bnnrqqTNnztj0nnBq/K5du9ju65kzZ1LErIW7IktRjbQm0XN9fX1jY2OrqqrMy4vqMRqNCQkJk02iBPaEY3JHN0Fr0Bq0tvQcgfBq9rlAa/QUAwpag9agNdSz4X7Xnw5ao6cYUNAatAat/yWDwTBr1qxf/vKXt99+e8/F1vyGK3d394iICH63VRfB1nVfM8X7waytVlReYz2gNSZ3dBO0Bq1BawuaNm2an59fY2MjEZo+G/v37x81atSWLVt6KPpsaGigykNDQ/skiu2hChFbY3JHN9FT0BrqWVrfe++9zKmDx9OffPLJc88913NQNBqN/A5jkQenomenShAs8hBtbW1NSkry9vb29PTMysrSSEpp/VILUhV/08zMTMp3c3NLSEjgU4yoHioQHx9PhadMmSL9IW3Qur/11Hz7t6I1ChiGnoLW/2oJ9jz1HK2HDBlCnwpKDBgwgCUMBsPQoUN7LrbeunUrj61FHpwiz07RSrjIQ5Ti+GXLltXW1jY1NW3atKkTtJZakKr4m/I7siiRmpqqXg8VkPYatAatMaCgtS3S+jGT+orW5me3c1pPmzYtLS2NEqNGjfruu+8oUV9f3xO05tetCXgXL15k+SIPTpFnp5br1lIPUQpn1a+Rq1+3llmQqvibcrcT6g6dVL0e6qbUHUXWCziP9p+eaqF1L/cUAwrn0X5C68LCwsdNOnr0aO/TWvHsdk7rK1eujB49moGTQl6KZSkYJU703Eq4VCIPThGVRfkiD1Gqn6q1tmGi06n4m6r3QlaPrNeyR+E82n96qoXWvdxTDCicR/sJranZ//znP6Ojo9955x0prWNjY++7775hw4ZR3MLWa0lElrfffvsuk4KDg+mwtLT04Ycf5j4flKDDsrIymhLDw8PvvfdeCho9PDx42KZ+dmtro3auXLlyzJgxt99+Ox1WVlbSPDxixIjBgwe/+eabV69eZcVu3rzp6+tLffnFL35B/eLfRTQ2sptpzVVTU0N4GDhw4Lhx47r9p5pFtBZ5cFpLa5GHqJbYWjutVfxNeS8oIV0hUKxHGltTLI6VcKyEY0CxEm5btKbRueeeey6aRAlOZeLZW2+9ddWk8ePHL1iwgOXPnTuXDimT4sO//OUv8+bNo8znnnvu4MGDrMCBAwcIPZRYvnz566+/TtUSAmmqnDZtmsazW1UbtZMoe+3aNXb4xBNPFBQUEJvpDRASEsJ/UJGaTcHVNZNooua01tLIHqR1j0oEJJEHp4jKnp6eUvryfJGH6NatW7t43Vqar+JvGhUVxXpBo6h43VpaT0pKCi9PFYLWoDUGFLS2LVpnZGQQrlj6tddeo7mRU5AHe2fPnqXglaV/9atf0SFLV1RUsAXdtWvXTp48mWW6u7uvW7eOEmPHjv3222/50i8FtRrPblVt1E5+EVYmivcoaGZpaie3lKZ+cVpraWSPrITTd4fhw4f3qJeZCEgiD04RrWmQ2HK3LF/kIUpYTUxMJJZ7eXllZ2d3kdYq/qZ8T/iqVavMeyGrhwpQMVdXV3oK9oRjckc3QWubozUFytu2beNBEcXTnIL84mNLS8udd97J0gMGDDDPv3Hjxl133UXRFEWulKBDyqSHBph0xx13UG1spVrL2a2qTca4wsLCP/3pT5yDvJis2fxZWhrZ/bSeNGnS22+/bUO/b+04Aq3RUwwoaN0PaU0xHuFKGt3RIWXKYmtKsBiaxdY8n2JrOmRpiqNWrFih1+sppmI5999/v/rlS5Wza69NRmtq544dO2j0KSRraGjgj1I7FWNri43sEVqPGDGCvowAjaA1JnfQGgMKWmuhdVxcnOx3fgMDA1euXMkoOGHCBHah929/+9v8+fNZgdDQUH49+8033+Q35R44cODXJvFLzu+//z6Fzt999x3FsqdOnfLw8NB+du21yWg9cuTI7OxsessRm6kMf5Ta6ezsXGuS9Lq1xUb2CK0HDx7c+x+JXhO9vnv37pXmFBcXd7shWklJyeLFi11dXekLHb2T+H3V9OVr6dKlbiZRgn8Xo69vqampnp6e9E1w8+bNol8/A63RUwwoaN0Paf30008fPnxYmvPZZ58988wzHf++J5yY2tzczArcvHmTmPq/TKIEt5ai2e9Bk/g02NbWFh0dPXbs2IEDBz711FMU8mo/u/baZLTOysp6+OGHBwwY8MADD6xevZo/ajAYfHx8hg4dSj0iQlMlGhvZI7R+9tlnbfR+NY20pu90/HYp0qJFi7qd1kRi+hJA70v6qG/YsIHIzfJDQkK2b9/eZNK2bdvokOXn5+fPmzev3iRK7Nu3D7TG5I5ugta2QmvHVHl5+UMPPdRdtXWG1h999BEB+5tvvrGV37e2ltbJycn8i1hRUdH69es5rVWcRKVGoRbtS2VTjIuLC0tTtXy6MRqNdMjS8+fPLysrY2lK8JscQOv+1lPsCQetQWsH15w5c65fv15TUzN+/PhO/8JF99Davn/fmrh75cqVmTNnsu8iYWFhFy9e5LRWcRKVGoVatC+V6vjx4/xSTUxMTHp6usFgoCdSkE2HLN/Dw4My+UoLfQkArUFrDChoDVr3QxEafv7zn48YMUKn03Xje6NHEGvT5GZgjoqKKiwsPHHiRERERIfkfioVJ1GpUahFixWuyspKKsz3ENbV1dEpmL0aJXidFLJLPXecnJyklcB5FM6jGFA4j4LW9i3QWpnWpaWlISEhc+bMKSkpkdJaxUlUWolF+1KmU6dOEarPnDnDc5YsWbJt2zZ+3ZoOtcTWcB6F8ygGFM6joDVo7Yi07jD9SBeJRbRSX1KRk6j0UEtsfeTIET8/v4qKCmmmi4uL9Lo1v56N69ZYCceAoqdYCQetQWshd2WZKk6i0vIW7UuzsrICAwMvXLggy5ftCec7FPLy8gjYbE84JbAnHLTGgILWoDVoDVoLM1WcRKXltdiXysTuMiR+L1q0yNWkxYsXm99vTUpLS8P91pjc0U3QGrQGrR2a1jYt0Bo9xYCC1qA1aA1ad3PIDlpjckc30VPQGuopWt9xxx0aaW2OqJ6Glkr9dXV1MTExnp6eLi4u4eHhX331VW9iuLs6rl4PaI2eYkBBawi0/peGDx/e0tLSObT0Ia0XLlyYlpZ248YN+jyfPn06MjIStMbkDlpjQEFryG5p/bvf/e7YsWNdpLXRaFyzZo2HSWvXrpX+wLPUwpMO8/Ly2K6ukJAQ7iKi6AAq3bRl3hiqgZ9F1iT+U9MJCQnSG6gsttD8jDU1NVFRUe7u7hTBR0REcHezTpzF/HVT7yBo3fs91bIDXPEPDENP+5bWnX7r9p83NmhtWR999NFTTz311VdfWTQAUaF1cnIyRbf0Rqdgl6iWkpLCC0gtPNlhXV1dc3Nzeno6/9E0FQdQUWPmzZuXmJhINDVvEmsJiRKpqanWtlBa2/Tp08vKygi6BoOBThcXF9fpsyi+boitQWsMKHoKWoPW2p6j2Sd8gpLYQ35+fpcuXWLp6upqf39//hSphScdNjY28o8ixccsreIAKmo2Vbt69Wo67+TJk2NiYvhPdNNTLl++zNLUJAqarW2hytxBwXSnz6Kd1nAe7auednpSgx8netq3zqOgtUPQWrtUYmsnJyf+q5QUo3MMiyglO9ToAKoo+jxTCMt/SIOeotiSzrWwvLx84cKF7u7u7KuJtGHdchbFDsJ5tK962ulJDX6c6GnfOo+C1g5Ba4PBMGvWrF/+8pe33367xdhalEMxJY81KaakQ6tordEBVCXqlXKRt4QSPLrtXAvp6UeOHKGXqL29nf5LKWvVWah51EiWbmxsxEo4VsIxoOgpVsJBa+s0bdo0ggohhAhNn439+/ePGjVqy5YtVtE6KSmJX8eNiIhITk62itYiB1BPT0+RQTeVP336tNFopNh669at/BI41RkVFcVasnz5cn5FWWMLZWfU6XTHjx+nl4XaRq2SUtaqs4SGhqanp9Psw2484/WodBC0Bq0xoKA1aA1a/3/de++97FIrj6c/+eST5557zipaEzUTEhImm0QJ9b3Q5ociB9CMjAy2Cm3emKKiovDwcBcXFw8PD+Il324m3a29atUq3hKNLZSd8dixY8HBwU5OToGBgTk5OVJaW3WWysrKkJAQ6h31MS8vj9ej0kHQGj3FgILWoDVo/f81ZMgQtkg7YMAAljAYDEOHDrXRl6B3XMZs5TOMyR20xoCC1qC1ndB62rRpaWlplBg1atR3333XYdpuDVr3h3OB1ugpBhS0tg9aw8G6G2h95cqV0aNHd5h2SIWGhjY3Ny9btuyNN95wKFrv3bs3NjbWPD8mJoYesniuTmMbu8wwuaOb6Kkt0prvRx40aNBLL71UVlbWm7R+zCSHozVXTU3NK6+8MnDgwHHjxp07d86hvuYYjUZfX9+rV69KM+mQMhUd07ortgatMbmjm+ipjdKaJQwGg16vf/LJJ3uN1oWFhY+bdPToUQeltYMrPT1906ZN0pzExETK7FD1H5UlVEqaW67CebSvJvfundFAa/TUkWnNop3BgwezdGtra3h4+L333jt06FAPDw9uh8XLNzc3v/3223eZFBwcTIeU+eijj3777bcdphtfb7/9drbxuby8nPIVX65//vOf0dHR77zzDh2WlpY+/PDD7e3t7FFK0CHF+iotWbly5ZgxY+hEHaYtwDQDjxgxgrrw5ptv8pjt5s2bFK0NGzbsF7/4RWxsLG+/qNreoHVSUhL3DmOiQ37rkeOooaGBOk7fE9lhU1OTj48PZXao+o/KEiolFS1XEVuD1hhQ9NSmaU1Uo4nuT3/6Eztcvnz566+/fvHiRcKYv7//tGnTZOXnzp07fvx4guKVK1f+8pe/zJs3jzJnzZq1ceNGSqxfv37IkCEffvghS8+ePdv8XXHPPfdcNIkSbGf0c889d/DgQVbgwIED48aNU28JUfbatWvs8IknnigoKKBe0NBTKOXt7c3b6eTkdM0kmqh5+0XV9gatH3jgAdm6Nx0++OCDDhhe05sjMzOTpSnB7cpl7xWp/6gKdGUlFS1X4TzaJ0aV3Tuj9XJPMaBwHu0ntOaiwLSkpITljx07lkXJHaZNURSYymj9q1/96uzZsyxdUVHBdk3l5eV5eXlR4q9//euCBQv+9re/UXry5Mn5+fmy82ZkZBAsWfq1117buXMnJdauXUuFWaa7u/u6devUW8L9oWWiKIuCZpamhvHfnSIm8vaLqu0NWg8aNEh2aZZwwpc1HEqXL18OCgpqNSkwMJC7kqn4j8oSFktqwTycR3u6p907o/VyTzGgcB7th7H1yy+/zA7vvPPOASbdcccdVIatNkvL00P8F6RaWlqoPKvkkUceoS8ud999Nw36yJEjCZwUNLJ1cqkoLt+2bRtLb9269a233uow/brEXXfdVVtbS3EwJehQS0v4VfA//elPw4cPZ988eDFZO/mzRNX2Bq2fe+65goICac6BAweeffZZx7x6HR0dfdgkSvBMFf9RWcJiSS20xko4VsIxoFgJt6Hr1k1NTTzAu//++xX9GaWxNV/NpdiaDln6zTffjImJYbcjUfRMaYqzZZVQLEuwlIb1dEiZ9BCF5itWrNDr9TqdTmNLeAy9Y8cOGneatBsaGqTtVIytRdX2Bq13795Np8/NzTWYlJOTM2bMGMp0TFpTcBxiEiV4por/qCxhsaTsEM6joDUGFD219dg6Pj7+P//zP9nh+++/T+Hvd999R/HoqVOnPDw8ZOVDQ0MpIL5qEhGab+JJSEj42c9+9sEHH1CauEvp1atXy05KQTz/8QWmwMDAlStXsiDz1ybxC9gWW8JEcXx2dja92YjNVIY/Sg1zdnauNUl63VpUbW/QmvTpp5+++OKLQ02iBAG7w4E13yRpjor/qCxhsaTsEM6jmNzRTfTUpq9bU3T7/PPPFxUVsfy2trbo6OixY8cOHDjwqaeeorDVnO40Pf4vkyhBhyz/7NmzVIbdt11aWkpp8xuJn3766cOHD0tzPvvss2eeeabDtBX8QZP45nCLLWHKysp6+OGHBwwY8MADD9D3A+mdaT4+PsTE++67jwhNlahX20u0hvqnQGv0FAMKWvdPWjuUysvLH3rooe6tE7QGrTG5g9YYUNAatO4GzZkz5/r16zU1NePHjw8NDQWtu0cTJkyQWYQWFxd3u493SUnJ4sWLXV1ddTpdXFwcNz+prq5eunSpm0mU4Jei29vbU1NTPT09vby8Nm/ezJdoOky/ITZ79uxJkyYFBwfzCy2gNXqKboLWoHU/UXx8/M9//vMRI0bQhN/t7wqHpjV992lra+M5ixYt6nZaE4npS0BzczN9pDds2EDkZvkhISHbt29vMmnbtm10yPLz8/PnzZtXbxIl9u3bx9dVfH19if0tLS30xY3eE6A1Jnd0E7QGrR1HDk3r5ORkvgGBItf169dzWhPFKbT18fGhsFiv1/N9DVQgOzs7ICCA3Rjd2tqalJTk7e1N0XBWVpbFqcTFxYWlqVo+rRiNRjpk6fnz53Oze0osWLCApaOiomR3zYHWPT2599B0hj3h6CloDYHW1tH6ypUrM2fOZKvNYWFhFy9e5LTesWMHhcW1tbXsZgNuUsYMQfmC9pYtW5YtW0bFKESWeYab6/jx43zreExMTHp6usFgoCdSkE2HLN/Dw4NbmVKCvgSwtE6n4ycFrUFrDChoDVqD1g5EaxazFhYWnjhxIiIiokNyo1RQUBC/lnzjxg3ui04F6uvreSUUZGu87b2yspIK83vn6+rq6BTMv4wSvE4K2aVe805OTixNCemivUxwHu2JnvYcreE8ip46oPMoBFp3idalpaUhISFz5sxhprWc1s7Ozk4mET5VDEGpALeaU9GpU6cI1WfOnOE5S5Ys2bZtG79uTYddia3hPNoTPe05WsN5FD11QOdRCLTuEq07TL+CRWIRLc8kuNKHUOVZ2mPrI0eO+Pn5VVRUSDNdXFyk16359WyV69aHDh3CSjhWwjGg6ClWwkFrB6W1YubOnTsjIyNramoodD5//rxer1d81tatW9WvW2dlZQUGBl64cEGWL9sTzu/My8vLI2CzPeGUkO4JJ+SfPHmS7QlPSEgArUFrDChoDVqD1o5Oawq1d+3aFRQU5OzsPHPmTIqPFZ9FLE9MTNTpdF5eXtnZ2YoVysR+Iob4vWjRIleTFi9ebH6/NSktLU3xfmv6oIr2h4PW6CkGFLQGrUFrqL8LtEZPMaCgNWgNWkOgNSZ30BoDag+0hkDrfqre8RnlCg8Pl1YuWwzn+SKf0bq6upiYGMp3cXGhqr766iteD2iNyR3dRE9Ba9DanmndCz6jTAUFBfPnz5fRWrGkyGd04cKFaWlpN27coKnn9OnTkZGRoDUmd3QTPQWtQWuHoHXv+IzS5zYwMLC6uloLrUX3azk7OxuNRsVegNY9NLn33A7wPr+8B1qD1hBobUu07h2f0XXr1u3evVtGVkrrdDpi8NSpU3ft2sVDfJEXCsXZiYmJNTU1oDVoDYahp6A15Fi07uh5n9GKigoKl2VGK1wE6aqqqkWLFnHSi3xG6aSrV6/28/ObPHlyTEwMfT9QpzWcR7ve016mNfw40dO+dR6FQOt+Teue9hklVFPIrk5W+mDzGFoUW3PR1JOSksJ/C0RUJ5xHu97TXqY1/DjR0751HoVA635N644e9hk190JRXDcjSHO6K163li3u0ZcJrIRjJRwDip5iJRy0diBaK2Z2l8+o6IxUIVVLldMp6ETcN1TkM0plTp8+bTQaKbamk4aFhYHWoDUGFD0FrUFrR6d1d/mMis745Zdfzpo1iyr39/dPSkri+71FPqNFRUXh4eEuLi4UhS9fvpxvN7MYuIPW6CkGFLSGQGuovwu0Rk8xoKA1BFpDoDUmd9AaAwpaQ6B1D8huPEctLoOD1ugpBhS0hkBrG6a1I3iOgtboKQYUtIZAa9umtSN4joLWaj3q3f3eWqxRwDD0FLSGQGs55xzBcxS0Bq3BMNAaAq1tm9YdduE5qnLdGs6j6upvtO5lo0o4j8J5FAKtbYbW9uo5yr9ow3lURf2N1r1sVAnnUTiPQqC1zdC6w949R7ESjpVwrA9jJRwCre2B1oqZduM5ClqD1mAYaA2B1nZLaxv1HMX91pjc0U3QGgADrSFbFWiNnmJAQWsItLbzgBu0xuQOWmNAQWsItO4GxFpcCu4KrXnN7u7uERER6tvK+uSrAH4xE5M7uomegtagtQMFxOoXsxsaGrZs2RIaGgpaY3IHrTGgoDUEWncDq4xG45o1azxMWrt2Ld/GJbMOpc9wfHy8m5vblClTMjMz1WnNquV3T9XU1ERFRVHA7eLiQjE3Nzij8nl5eWyHWkhISGVlpWwBgBXTaG4qOgtobV3j+9n2b9EfGIaegtaQY9E6OTk5MjKSPjA3btwgyKWkpPDCUuvQ1NRUaTGLsfXWrVt5bD19+vSysjLit8FgSExMjIuLk56irq6uubk5PT1ddLeVRnNT0VlAa9AaDENPQWvI5q9b+/n5Xbp0iaWrq6v9/f15Yal1KOVfvnyZF7N43Zr4yr3JZNMBRcm8fGNjI88XOZloNDcVnUULreE82m9NRlVuuYYfJ3oK51HIgWJrJycn/lMZra2tImTKillcCZeqvLx84cKFhHDGcpE7KT+U5Ws0NxWdRUsL4Tzab01GRX/w40RP4TwKORatKbaWBs10qFhYGltTLG4Vrem5R44cMRgM7e3t9F9EZVG+RnNT0VmwEo6VcKwPo6dYCYdsntZJSUnsgjQpIiIiOTlZsXBKSkpUVBQrRuWtYqFOpzt+/DjNAjU1NXq93iKtPT09pXd/aTQ3FZ0FtAatwTD0FLSG7GFPeEJCwmSTKCHdEy4rtmrVKldXVx8fHy17wqU6duxYcHCwk5NTYGBgTk6ORVpnZGSwBW12qNHcVHQW2SnU7zgHrdFTDChoDYHWUH8XaI2eYkBBawi07r8Rdl9VLoqzQWtM7qA1BhS0hmyY1mwJ19nZ2c/PLzY2ljmK9Amti4qKZs+ePWnSpODg4IMHD4LWmNxBawwoaA2B1v+Gt/b29vr6+pycHC8vr3PnzvU+rcvLy319fUtKSlpaWmpqauLj40FrTO6gNQYUtIZAa2XW5ubmvvfeeywt8hAVmYayjWPm+SKnT6mioqIKCgoUm2duJtqhaj4qS6j4jCrWbG0vZH6loHWH7ewDx55w9BS0hmyV1tevX/f29mZpkYeoyDSUyhPp2U1ZhFKeL3L6lEqn04mMuBXNRFXMR2UJdZ9R85qt7YXMrxS0Bq3BMNAaAq17nNZS9zGRh6jINJTyKeRlaSrA80VOn1JJrc1kzVM0E5XNCFLzUVlCxWdUsWZre6HoV+rgzqO2SGv4caKncB6FbCy25uQTeYiKTENF+SKnT42xteKhRfNRi2cX1WxtL0S3WTuy86gt0hp+nOgpnEchW6J1bm5udHQ0j60VPURFpqFUQDEqFTl9ShUVFXXo0CHttLZoPmrx7KKare2F+nY2rIRjJRwr4VgJh0DrbqM1MY++BROqKcbl+61EHqIi01Aq8P777zeYJL3iK3L6lIpiZcLkyZMn2Z7whIQEdaZaNB+1eHZRzdb2ArQGrcEw9BS0Bq17g9YkJycnX1/f2NjYqqoq/pDIQ1RkGkqfzLi4OJZPbOMr5yKnT5n4/db0vuf7w0VMtWg+aq3PaKd7AVpjckc30VPQGrS2VV28ePHtt99GL0Br9BQDClpDoHW/06ZNm+hzcv369cjIyKSkJLvpRae9VkBr9BQDClpDoHW/06effurt7e3u7v7BBx80Nzdrf+I7JklzCJB79+6V5hQXF0upqehUKquhu3rRaYs00Bo9xYCC1hBobScqLy+fZhIlpKwNDQ2V3oS9aNEi6R1cik6l3ULrbqwKtEZPMaCgNQRa24nWrl27y6R169ZJAZmcnHz48GEeSa9fv55TU+RUqohYc5vS77//niLy9vZ2VoASdFhVVaViL2qeUDQuBa3RU3QTtIZAazsUfZh1Ol2tSZTgn23C4ZUrV2bOnMmYGhYWdvHiRekdXCKzT3NaK9qUzpkzp7S0lBWgBMXxHar2ouYJReNSh6W1Ld61hTu40FPQGgKtteqLL74gQLL0kiVLvvzySykXKSYuLCw8ceIExcQdAscxi7SWTR/MrC03Nzc2NpZlxsTE7Nmzp0PVXtQ8oWKJ6oDOo7ZOa/hxoqdwHoVAazVFRkby5W5K0KGUixT1hoSEUBxcUlLS8e/uKNpja0Wb0qamJg8PD5pKqB5K0GGHBntR0XYz2aEDOo/aOq3hx4mewnkUAq2Fok8yAXKCRHRImbJ1bBJbD5det1Z0KlUkqMimdMWKFbt3787MzPzggw9YjkV7UY20xko4VsKxPoyVcAi0th9lZWWtWrVKmpOQkJCdnS3inzRcVnQqVSwssimlwH2qSfwCtkV7UdAatAbD0FPQGnI4Ws+aNevUqVPSnNOnT8+ePdsirTsETqVcRqPRxcWFpUU2pRRqB5kk3Ryubi8KWoPWYBh6ClpDHY55B1e3q62tLT8/f+7cuX3eEtzBhZ5iQEFrCLSGlDVx4sRp06Z9++23oDUmd9AaAwpaQ6C1ZVk0EO1ehYeHSyuf8O/i+e3t7ampqZ6enl5eXps3b+Yr4XV1dTExMZTv4uJCVX311Ve8HvNzWbQ+Ba3RUwwoaA2B1jZDaxUD0e5VQUHB/PnzZbRWLJmfnz9v3rx6kyixb98+lr9w4cK0tLQbN27QFHP69GnZ7WRSabE+Ba3RUwwoaA2B1jZDaxUDURWnz+zs7ICAAHbHc2tra1JSkre3N0W9WVlZiieiz2dgYGB1dbUWWhPUy8rKWJoSCxYsYGlnZ2f+M96yXshytFifgtboKQYUtIZAa5uhtYqBqIrTJ8Gb+59s2bJl2bJlVKypqWnTpk2KJ1q3bt3u3btlZKW0TqcjBk+dOnXXrl08xPfw8DAYDCxNCfoSwNIUZycmJlKsbJHWWuxZOrAnHHvCQWvQGgKtbYXWHWIDURWnz/r6el4JBdm8mKIqKiooXJY5qHARpKuqqhYtWsRJTyG79K4tJycnlqaTrl692s/Pb/LkyTExMfT9QERrdetTOI/CeRR+nHAehUBr26O1yEDUotMnR2Nra6vKWQjVFLKLyMpEH2AeQ4tiay6aYlJSUqjazsXWcB6F8yj8OOE8CoHWtkfrDoGBqEWnT42x9QQzKa6PEaQ53RWvW8sW8fhvdShet7ZofYqVcKyEYyUcK+EQaG1jtFbMtOj0ybR161aL160Vz0gVUrVUOZ2CTsQNSvPy8gjYbE84JfiecCpz+vRpo9FIsTWdlP8OpuKecIvWp6A1aA1ag9YQaG0PtLbo9MlEuE1MTNTpdF5eXsxFXOMZv/zyy1mzZlHl/v7+SUlJfL83v9+alJaWxq9hFxUVhYeHu7i4UBS+fPlyvt1MMXBXtz4FrUFrMAy0hkBryDaEO7jQUwwoaA2B1hBojckdtMaAgtYQaG2NetlkVL0lKoc8k2nSpEkLFiyoqqoCrTG5o5voKWgNOQSte81k1Cpaq5ehCSUzM3PGjBmgNSZ3dBM9Ba0hh6C1isloTU1NVFSUu7u7i4tLREQEv1mZ4m8ipbOzc1BQEN+brdGRVLFO8+1gFn8qu6Wlhf8YttFoXLNmjYdJa9eu5RvTtJwatEZP0U3QGgKtbYDWKiaj06dPLysrI/gZDIbExMS4uDiW7+3tXVhYSB/pa9eurV69mmVqdCQV1alxJZzjOSsra+HCheyQvnBERkbSKW7cuEEYTklJserUjkZrW98Kzo3MwDD0FLSGHIjWHWKTUdlnmOJmlqZoNTc3l3t8Mml0JBXVadV1axKFyN999x3L9/Pzu3TpEktTG/z9/a06NZPjOI/aB6172agSzqNwHoVA676ntchktLy8nOJX4iIDJDcZPXv2LAFep9MFBwcT41mmRkdSUZ2diK3fffdddig1AG9tbRXZmYlOzb9oO4jzqH3QupeNKuE8CudRCLTue1p3CExGKUg9cuSIwWCgfPovgx9lFhUV+fr68oBbiyOpqE6raE1qbm7m160ptr58+TKPrenQqlNjJRwr4Vgfxko4BFrbBq0VMyl6Pn78OH10a2pq9Ho9z6f0hQsXWlpaiNbe3t4sU6MjqahOT09Pqa+4xdj6008/pa8X7DApKYldtyZFREQkJydbdWrQGrQGw0BrCLS2YVofO3YsODjYyckpMDAwJyeH51OEOnXqVGdn5xkzZrDF8w7NjqSiOjMyMtgatXrDmOgUoaGh586d4/BOSEiYbBIlpHvCtZwatAatwTDQGgKtIRsT7uBCTzGgoDUEWkOgNSZ30BoDClpDoLWSuteerE/MznrtNQGt0VMMKGgNgdY9Lv6jkMHBwQcPHuxvtO410ls8EWiNyR3dBK0BMNC6b1ReXu7r61tSUtLS0lJTUxMfH++wtEZsjckd3URPQWuon9I6KiqqoKBAkUx5eXlsw3ZISEhlZSXP507a3t7eDQ0NLL+1tdXHx4c+QoqW4JxzGr3BFRlJiR07dnh6etLXixMnTuzatUun01G6tLSUF8jMzKTK3dzcEhIS+Ayi8aQW3c4djdb2sRVc+geGoaegNWSrtCbgKf5YBXPMrqura25uTk9PDwsLk+azp2zcuHHnzp0s/+uvv46MjOwQWIJzzmn0BhfR+sMPP6T27N+/n1CamJjI0jNnzuQF+F3UlEhNTbXqpBbdzkFr0BoMA60BMNC6byT14JQxsrGxkX8apd6c3EmbYtDAwECKqilNCGQ3TCtagnPOdcIbXEpr1iSaGqRpadu4Q9mlS5eoJVad1KLbuayA3fuE2x+t4Z6NnsInHLLD2FqETGl+TEzM559/3t7ePnXqVOYxomgJzp+l0Rvc4qkV05RQdP/WeFKLbuey8nbvE25/tIZ7NnoKn3DIVmlNZD106FCnaV1RUTF37lzCG9+exiSzBOfP0ugN3mla89iaEvyXtTSe1KLbOVbCsRKO9WGshANgoHXfiEDr5+d38uRJtic8ISHBKlqTKAx99913y8rK2KGiJTh/lkZv8E7Tmr58sG/By5cv59etNZ7Uots5aA1ag2GgNQAGWveZ+P3W9F7k+8O105rARsEr+zGuDoElOH+WRm/wTtOa7wlftWoVd//WeFKLbue4gwuTO7oJWgNgoLWtKj8/n0exfau+ujMbtEZPMaCgNQRa92sZDAaKpGU7wEFrTHnoKQYUtIZA6/4itl86NzfXYjH2m5V+fn6xsbHcaKXbYWyxQFFRUXh4uIuLi06nY3eT84e+//77ZcuWubu7UyMPHDjAMtvb21NTUz09Pb28vDZv3sxX+0Fr9BTdBK0h0NrexCBKqKuvr8/JySHy8d+Z7uXQedGiRUePHm1qarp582ZGRsb8+fNZfnV1dWBgID1E8861a9f4Vrv8/Px58+bVm0QJbs0GWqOn6CZoDYHW9klrLorF33vvPcWH+KG5fekEiViZTpiYSmU0GumJLL1ixQoeT0tFOOd73SmxYMECO6a1/e0AN7dGAcPQU9AaAq210vr69evmd3bJDtXtS5k6YWLK1dzcvGvXLmaVSpoyZcrOnTt9fX3d3NxiYmL4LODh4WEwGFiaEp6enqA1aA2GgdYQaO0QtJa6jIlorW5fytQJE1NegERBObdScXJyou8EjSatWrWK35BN0Tm/Vk0JKiatx86cR+2e1r1sVAnnUTiPQqC1zcfWIudtfqhuX8rUCRNTLgqUKTQPDw/nMTT/nk7Adnd31xJb25nzqN3TupeNKuE8CudRCLS2bVpT0BwdHc2Je+vWLY5JWUmRfSmPv601MZXKaDS6uLiw9MKFC6W0njx5MkvjujVWwrE+jJ5iJRy0dixaE3rpOzihmiJmfhNXaGhoeno6fdqJuzExMRy0ivalFNrype+OTpmYrly5kqql8tSS5ORkCohZ/oEDBxISEthi16pVq1asWMHy8/LyCNhsTzgl7HtPOGgNhqGnoDXk6LQmOTk5UZQcGxtbVVXFHyJsh4SEsL3fhEYOWkX70oyMDPa7WDzyttbE9Msvv5w1axaV9/HxISpLd6J99NFH9LVAtsuM329NSktLw/3WmNzRTdAaAAOtIVsVaI2eYkBBawi0hkBrTO6gNQYUtIZA624V/0Wv4ODggwcP9p+GTVASe6ikpGTx4sWurq46nS4uLo6vkFdXVy9dutTNJEpIr5qD1ugpuglaQ6C1raq8vNzX15fgx34tOz4+vt82NT09fevWrSxNJC4uLm5ubqYpYMOGDURulh8SErJ9+/Ymk7Zt20aHoDUmd3QTtIZAa5tXVFQU/4VsqYjc9JC7u7uLi0tERAQPXim63bFjh6enJzH+xIkTu3btouiW0qWlpRafKLUXNRqNa9as8TBp7dq1/JetRfrss8/0er3irjGaevidXRRt82lI6lRqW7S2+83e2v/AMPQUtIZA6/8rYq2i5ef06dPLysoIeAaDITExMS4ujkP3ww8/pKB2//79hGR6iKVnzpxp8YlSe9Hk5OTIyEg6vHHjBkE9JSVFpZHffPPNokWLREQ/fvw4/7WPmJgYCsHp1BRbU5BNh6A1aA2GgdYQaG3zcnJyamtrs/jZlnqZNTY2UoI+7dI0tyZVeaLUXtTPz+/SpUssXV1d7e/vLzo7BethYWEiF/HKykqK1/nt4HV1dUFBQewKNyVkhqa24jwKSEtvuYYfJ3oK51EItBbG1uXl5QsXLmR3S4tcQhXTWp4o+5Yg9SGXiT5vc+fOvXDhguKjp06dIlSfOXOG5yxZsmTbtm38ujUdyr5o24TzKCDN/+DHiZ7CeRQCrf+voqKiDh06ZJ5Pwe6RI0cMBkN7ezv956y1SGstT2SxNf+JDoqt6dC8DUTxpUuX8iviMtFZ6FkVFRXSTBcXF+l1a349GyvhWAnH+jBWwiHQ2oZFoTAx7+TJk2xPeEJCAo+5jx8/Th9pytTr9dppreWJpKSkJHbdmhQREZGcnGzetvj4+L179yo2OysrKzAw0Dzmlu0JDw0NBa1BazAMtIZAa3sQv9+a3tl8f/ixY8eCg4OdnJwIijk5OdppreWJLPClbwaTTaKE4g4ylfutzfObm5spn/i9aNEiV5MWL16M+60xuaOboDUABlpDtirQGj3FgILWEGjdv6Tx9yjtUqK+g9boKQYUtIZA664SpXv5am1t3WJEKjtpt39j0FghaI3JHd0ErQEw0No2Yl+r6u8uI9J+0inQGpM7uglaA2CgdY/H1pTIy8tjPwgdEhLCPUBaW1uTkpK8vb09PT2zsrJYpsjL02JtUomMSFUqN69TcVOYehva2to2b97s4+Pj6uqq1+tv3rxpVf0qdqfd8hnG3mzsCQetQWsItFajNaGrrq6uubk5PT09LCyM5W/ZsmXZsmW1tbVNTU2bNm1imSIvT4u1SSUyS1GpXLFO0Uq4qPyOHTuWLl1KPSJOU0C/fv16q+pXsTsFrUFrMAy0hkDrHqc1s/ZkHzBu+BUQEGB+b5LIy9NibVKJjEhVKlesU4XWiuUpeuY9oi8EU6ZMsap+2UwktTuVPtRp51FQE86jcB6F8ygEWqvRWjGfmNra2qoCWqmXp8XatMTWFivXeC5RPlXoZNLEiRNV/EpF9Wi0O+208yioCedROI/CeRQCra2mtSi2VvTytIrWIiNSi5V3kdbUI/owW3xxRPVotDvFSjhWwrE+jJVwCLTuPVpv3brV/Lq1yMvTKlqLjEgtVi479PT0lH6fsNiGnTt3Uv10Rgrcz58/r9frrapfo90paA1ag2GgNQRad57Wsk3OFtlGSEtMTCREeXl5ZWdns0yRl6dVtO4QGJFarFx2mJGRwdalNbaBYuJdu3axvd8zZ86kQNmq+jXanYLWoDUYBlpDoDVkM8L91ugpBhS0hkDrvpH2FfWeO2P/f01Aa/QUAwpaQ6B1V9UV10+VZeeuY1X0Q1j9HPOgNSZ3dBO0BsBA625WF10/ezS2VqwBtMbkDlpjQEFryOFoLXL9FNlq0ueNiO7m5jZlypTMzEwtsbWoKkUrU+20FvmGKubLYnT6OLHd3XV1dRMnTqyvr6f0xYsXKb9D7Hgqyhe9Jl38DGO3F3aZgdagNQRa/0siZxKRrWZqaqrUDVQLrUVVKVqZaqe1yDdUxU+UV/Lhhx/m5+dTIi8vj6C+d+9elqbmdYgdT0X5otcEtAatwTDQGgKtu0ci10/Zx4zbavr7+0sdS6y9bi2tStFuRQZmlevWIt9QFT9RXnNxcfGKFSs6TLagxNrly5dTOjY2tqSkpEPseCrKF70mTHAehfMo/DjhPAqB1j0VW4tsNWVuoFporVKVuZWp9tha5BuqxU+UAv3g4ODm5mYvLy+K7OlFoK8RhHm2uC1yPNWYD+dROI/CjxPOowAYaN39160VXT9FtprSOJICTS20FlWlJbZWyRT5hmr0E42IiPj444+XLVtG6aVLl1Kaf8BEjqeifNFrgpVwrIRjfRgr4RBo3T0SuX6KbDVTUlII8OwrZGRkpBZai6pStDLVTmuRb6goX+Yb+umnn3p4eLDdbbt376Z0Tk4Oe0jkeCrKF70moDVoDYaB1hBo3W1SdP0U2WoajcZVq1a5urr6+Pho3BMuqkrRylQ7rUW+oaJ8mW8oC4Krqqoo/f3331Oax8cix1OVfMXXpCc+w5jc7aynGFDQGgKtof4l0Bo9xYCC1hBoDYHWmNxBawwoaA2B1lCXP8POzs7/sEG98cYbNtpy9BQD2vs9pZOC1qA1ZMMqKCj4u23qlVdeoQno7w4gB+kpBrSndfLkScx4oDUE2eQaPnqKbqKnEGgNQZjy0FN0E7SGQGsIgiAIgkBrCIIgCAKtIQiCIAgCrSEIgiAItIYgCIIgCLSGIAXJfmLcLtXe3p6amurp6enl5bV582Y6xFDatEpKShYvXuzq6qrT6f5Pe/fTkkgYB3C8g4Vmp96AlgoRQYckonPgaYu82CGIuvQGrFsHr0G3QD1EEgQeom6KE13solRINR0KuhhdooKC8U9R7I+dZZDW1pZtoXn2+znI08zDRj48fZtthlZWVpr+XWCAWkPNb/QKf3XZbDYajd79IINcLsdS2trS0tLh4WG1WpVOx+NxKTdbGNQa1Nr2FhYWjo+PzbEMFhcXWUpl1Gq1cDjMFga1BrW2vUgkYhiGOZbB1NQUS6mMQqEgP42xhUGtQa1tb3x83PpdtQwmJiZYSjVcXl7Ozs7KK1sY1BpqfkN/czsS19bU2nZOTk4k1bqus6NBrcG1tQr4vbV68vn8zMzM+fk5mxfUGtRaEZlMRoJt3hMuA+4Jt7udnZ25ublyuczOBbXGf9TpRkp+jdbz1iKVSin/vLXyT11/+0W1WmUvg1oDAECtAQAAtQYAANQaAABqDQAAqDUAAKDWAABQawAAQK0BAKDWAACAWgMAAGoNAAC1BgAA1BpQfvu1tW1ubgaDQZfL5Xa7x8bGTk9PM5nM6OhoZ2enHJmcnLy5ubEmJxIJv9/f3t7e29u7vr7e+E8lk0mv1yunZIJMk8ktP/UbLAdArQE0T+bAwMD+/n69Xr+9vZ2fn+/u7h4cHMzn87VazTwSDoetyT6fr1gsyuRCoSDB3t7eNk+l02mJtHlKXmXaH9VX6h4KhVgOgFoDaF5rXdetD+/v7+XI2dlZ45Guri5rci6Xs05ls9mRkRFzPDw8rGmadUqmfbzWcikvF/ePj48sB0CtATSv9evra8sj1qBSqVjHDcNwuVzm2Ol0vjn1wVqXSqX+/v7r62vWAqDWAN6t9cePfHqtr66uJNWNF/cAqDWAv631b/4nfHd31zqlaVrLWj88PASDwb29PVYBoNYAPrPW5q1kT09P5l1mW1tb5ql0Oh0IBA4ODuSUvMq4Za1DodDGxgZLAFBrAJ9c63g87vP5HA5HT0/P2tpa47REIuHxeMwnuFZXVzs6Olp+ap7gAqg1gH+e9vccHR319fXxjgHUGsDXqvX09PTFxcXz83OpVBoaGlpeXuYdA6g1gK9V61Qq5ff7HQ6Hx+OJxWIvLy+8YwC1BmCPwDfFOwNQawAAQK0BAKDWAACAWgMAAGoNAAC1BgAA1BoAAPz0HUE0SXQD/AQKAAAAAElFTkSuQmCC" /><!-- --></p>
650
+ </div>
651
+ <div id="inline-ruby-code" class="section level3">
652
+ <h3>Inline Ruby code</h3>
653
+ <p>When using a Ruby chunk, the code and the output are formatted in blocks as seen above. This formatting is not always desired. Sometimes, we want to have the results of the Ruby evaluation included in the middle of a phrase. gKnit allows adding inline Ruby code with the ‘rb’ engine. The following chunk specification will create and inline Ruby text:</p>
654
+ <pre><code>This is some text with inline Ruby accessing variable 'b' which has value:
655
+ ```{rb puts b}
656
+ ```
657
+ and is followed by some other text!</code></pre>
658
+ <div style="margin-bottom:30px;">
659
+
660
+ </div>
661
+ <p>This is some text with inline Ruby accessing variable ‘b’ which has value: US$ 250.000 and is followed by some other text!</p>
662
+ <div style="margin-bottom:30px;">
663
+
664
+ </div>
665
+ <p>Note that it is important not to add any new line before of after the code block if we want everything to be in only one line, resulting in the following sentence with inline Ruby code.</p>
666
+ </div>
667
+ <div id="the-outputs-function" class="section level3">
668
+ <h3>The ‘outputs’ function</h3>
669
+ <p>He have previously used the standard ‘puts’ method in Ruby chunks in order produce output. The result of a ‘puts’, as seen in all previous chunks that use it, is formatted inside a white box that follows the code block. Many times however, we would like to do some processing in the Ruby chunk and have the result of this processing generate and output that is “included” in the document as if we had typed it in <strong>R markdown</strong> document.</p>
670
+ <p>For example, suppose we want to create a new heading in our document, but the heading phrase is the result of some code processing: maybe it’s the first line of a file we are going to read. Method ‘outputs’ adds its output as if typed in the <strong>R markdown</strong> document.</p>
671
+ <p>Take now a look at variable ‘c’ (it was defined in a previous block above) as ‘c = “The ‘outputs’ function”. “The ‘outputs’ function” is actually the name of this section and it was created using the ’outputs’ function inside a Ruby chunk.</p>
672
+ <p>The ruby chunk to generate this heading is:</p>
673
+ <pre><code>```{ruby heading}
674
+ outputs &quot;### #{c}&quot;
675
+ ```</code></pre>
676
+ <p>The three ‘###’ is the way we add a Heading 3 in <strong>R markdown</strong>.</p>
677
+ </div>
678
+ <div id="html-output-from-ruby-chunks" class="section level3">
679
+ <h3>HTML Output from Ruby Chunks</h3>
680
+ <p>We’ve just seen the use of method ‘outputs’ to add text to the the <strong>R markdown</strong> document. This technique can also be used to add HTML code to the document. In <strong>R markdown</strong>, any html code typed directly in the document will be properly rendered.<br />
681
+ Here, for instance, is a table definition in HTML and its output in the document:</p>
682
+ <pre><code>&lt;table style=&quot;width:100%&quot;&gt;
683
+ &lt;tr&gt;
684
+ &lt;th&gt;Firstname&lt;/th&gt;
685
+ &lt;th&gt;Lastname&lt;/th&gt;
686
+ &lt;th&gt;Age&lt;/th&gt;
687
+ &lt;/tr&gt;
688
+ &lt;tr&gt;
689
+ &lt;td&gt;Jill&lt;/td&gt;
690
+ &lt;td&gt;Smith&lt;/td&gt;
691
+ &lt;td&gt;50&lt;/td&gt;
692
+ &lt;/tr&gt;
693
+ &lt;tr&gt;
694
+ &lt;td&gt;Eve&lt;/td&gt;
695
+ &lt;td&gt;Jackson&lt;/td&gt;
696
+ &lt;td&gt;94&lt;/td&gt;
697
+ &lt;/tr&gt;
698
+ &lt;/table&gt;</code></pre>
699
+ <div style="margin-bottom:30px;">
360
700
 
361
- print gg</code></pre>
362
- <pre><code>## This is the fake output</code></pre>
363
- <div class="figure">
364
- <img src="data:image/png;base64,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" alt="Diverging Barcharts" style="width:70.0%" />
365
- <p class="caption">Diverging Barcharts</p>
366
701
  </div>
367
- <pre class="ruby"><code>@vec = R.c(1, 2, 3)
368
- puts @vec</code></pre>
369
- <pre><code>## This is the fake output</code></pre>
702
+ <table style="width:100%">
703
+ <tr>
704
+ <th>
705
+ Firstname
706
+ </th>
707
+ <th>
708
+ Lastname
709
+ </th>
710
+ <th>
711
+ Age
712
+ </th>
713
+ </tr>
714
+ <tr>
715
+ <td>
716
+ Jill
717
+ </td>
718
+ <td>
719
+ Smith
720
+ </td>
721
+ <td>
722
+ 50
723
+ </td>
724
+ </tr>
725
+ <tr>
726
+ <td>
727
+ Eve
728
+ </td>
729
+ <td>
730
+ Jackson
731
+ </td>
732
+ <td>
733
+ 94
734
+ </td>
735
+ </tr>
736
+ </table>
737
+ <div style="margin-bottom:30px;">
738
+
739
+ </div>
740
+ <p>But manually creating HTML output is not always easy or desirable, specially if we intend the document to be rendered in other formats, for example, as Latex. Also, The above table looks ugly. The ‘kableExtra’ library is a great library for creating beautiful tables. Take a look at <a href="https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html" class="uri">https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html</a></p>
741
+ <p>In the next chunk, we output the ‘mtcars’ dataframe from R in a nicely formatted table. Note that we retrieve the mtcars dataframe by using ‘~:mtcars’.</p>
742
+ <pre class="ruby"><code>R.install_and_loads('kableExtra')
743
+ outputs (~:mtcars).kable.kable_styling</code></pre>
744
+ <table class="table" style="margin-left: auto; margin-right: auto;">
745
+ <thead>
746
+ <tr>
747
+ <th style="text-align:left;">
748
+ </th>
749
+ <th style="text-align:right;">
750
+ mpg
751
+ </th>
752
+ <th style="text-align:right;">
753
+ cyl
754
+ </th>
755
+ <th style="text-align:right;">
756
+ disp
757
+ </th>
758
+ <th style="text-align:right;">
759
+ hp
760
+ </th>
761
+ <th style="text-align:right;">
762
+ drat
763
+ </th>
764
+ <th style="text-align:right;">
765
+ wt
766
+ </th>
767
+ <th style="text-align:right;">
768
+ qsec
769
+ </th>
770
+ <th style="text-align:right;">
771
+ vs
772
+ </th>
773
+ <th style="text-align:right;">
774
+ am
775
+ </th>
776
+ <th style="text-align:right;">
777
+ gear
778
+ </th>
779
+ <th style="text-align:right;">
780
+ carb
781
+ </th>
782
+ </tr>
783
+ </thead>
784
+ <tbody>
785
+ <tr>
786
+ <td style="text-align:left;">
787
+ Mazda RX4
788
+ </td>
789
+ <td style="text-align:right;">
790
+ 21.0
791
+ </td>
792
+ <td style="text-align:right;">
793
+ 6
794
+ </td>
795
+ <td style="text-align:right;">
796
+ 160.0
797
+ </td>
798
+ <td style="text-align:right;">
799
+ 110
800
+ </td>
801
+ <td style="text-align:right;">
802
+ 3.90
803
+ </td>
804
+ <td style="text-align:right;">
805
+ 2.620
806
+ </td>
807
+ <td style="text-align:right;">
808
+ 16.46
809
+ </td>
810
+ <td style="text-align:right;">
811
+ 0
812
+ </td>
813
+ <td style="text-align:right;">
814
+ 1
815
+ </td>
816
+ <td style="text-align:right;">
817
+ 4
818
+ </td>
819
+ <td style="text-align:right;">
820
+ 4
821
+ </td>
822
+ </tr>
823
+ <tr>
824
+ <td style="text-align:left;">
825
+ Mazda RX4 Wag
826
+ </td>
827
+ <td style="text-align:right;">
828
+ 21.0
829
+ </td>
830
+ <td style="text-align:right;">
831
+ 6
832
+ </td>
833
+ <td style="text-align:right;">
834
+ 160.0
835
+ </td>
836
+ <td style="text-align:right;">
837
+ 110
838
+ </td>
839
+ <td style="text-align:right;">
840
+ 3.90
841
+ </td>
842
+ <td style="text-align:right;">
843
+ 2.875
844
+ </td>
845
+ <td style="text-align:right;">
846
+ 17.02
847
+ </td>
848
+ <td style="text-align:right;">
849
+ 0
850
+ </td>
851
+ <td style="text-align:right;">
852
+ 1
853
+ </td>
854
+ <td style="text-align:right;">
855
+ 4
856
+ </td>
857
+ <td style="text-align:right;">
858
+ 4
859
+ </td>
860
+ </tr>
861
+ <tr>
862
+ <td style="text-align:left;">
863
+ Datsun 710
864
+ </td>
865
+ <td style="text-align:right;">
866
+ 22.8
867
+ </td>
868
+ <td style="text-align:right;">
869
+ 4
870
+ </td>
871
+ <td style="text-align:right;">
872
+ 108.0
873
+ </td>
874
+ <td style="text-align:right;">
875
+ 93
876
+ </td>
877
+ <td style="text-align:right;">
878
+ 3.85
879
+ </td>
880
+ <td style="text-align:right;">
881
+ 2.320
882
+ </td>
883
+ <td style="text-align:right;">
884
+ 18.61
885
+ </td>
886
+ <td style="text-align:right;">
887
+ 1
888
+ </td>
889
+ <td style="text-align:right;">
890
+ 1
891
+ </td>
892
+ <td style="text-align:right;">
893
+ 4
894
+ </td>
895
+ <td style="text-align:right;">
896
+ 1
897
+ </td>
898
+ </tr>
899
+ <tr>
900
+ <td style="text-align:left;">
901
+ Hornet 4 Drive
902
+ </td>
903
+ <td style="text-align:right;">
904
+ 21.4
905
+ </td>
906
+ <td style="text-align:right;">
907
+ 6
908
+ </td>
909
+ <td style="text-align:right;">
910
+ 258.0
911
+ </td>
912
+ <td style="text-align:right;">
913
+ 110
914
+ </td>
915
+ <td style="text-align:right;">
916
+ 3.08
917
+ </td>
918
+ <td style="text-align:right;">
919
+ 3.215
920
+ </td>
921
+ <td style="text-align:right;">
922
+ 19.44
923
+ </td>
924
+ <td style="text-align:right;">
925
+ 1
926
+ </td>
927
+ <td style="text-align:right;">
928
+ 0
929
+ </td>
930
+ <td style="text-align:right;">
931
+ 3
932
+ </td>
933
+ <td style="text-align:right;">
934
+ 1
935
+ </td>
936
+ </tr>
937
+ <tr>
938
+ <td style="text-align:left;">
939
+ Hornet Sportabout
940
+ </td>
941
+ <td style="text-align:right;">
942
+ 18.7
943
+ </td>
944
+ <td style="text-align:right;">
945
+ 8
946
+ </td>
947
+ <td style="text-align:right;">
948
+ 360.0
949
+ </td>
950
+ <td style="text-align:right;">
951
+ 175
952
+ </td>
953
+ <td style="text-align:right;">
954
+ 3.15
955
+ </td>
956
+ <td style="text-align:right;">
957
+ 3.440
958
+ </td>
959
+ <td style="text-align:right;">
960
+ 17.02
961
+ </td>
962
+ <td style="text-align:right;">
963
+ 0
964
+ </td>
965
+ <td style="text-align:right;">
966
+ 0
967
+ </td>
968
+ <td style="text-align:right;">
969
+ 3
970
+ </td>
971
+ <td style="text-align:right;">
972
+ 2
973
+ </td>
974
+ </tr>
975
+ <tr>
976
+ <td style="text-align:left;">
977
+ Valiant
978
+ </td>
979
+ <td style="text-align:right;">
980
+ 18.1
981
+ </td>
982
+ <td style="text-align:right;">
983
+ 6
984
+ </td>
985
+ <td style="text-align:right;">
986
+ 225.0
987
+ </td>
988
+ <td style="text-align:right;">
989
+ 105
990
+ </td>
991
+ <td style="text-align:right;">
992
+ 2.76
993
+ </td>
994
+ <td style="text-align:right;">
995
+ 3.460
996
+ </td>
997
+ <td style="text-align:right;">
998
+ 20.22
999
+ </td>
1000
+ <td style="text-align:right;">
1001
+ 1
1002
+ </td>
1003
+ <td style="text-align:right;">
1004
+ 0
1005
+ </td>
1006
+ <td style="text-align:right;">
1007
+ 3
1008
+ </td>
1009
+ <td style="text-align:right;">
1010
+ 1
1011
+ </td>
1012
+ </tr>
1013
+ <tr>
1014
+ <td style="text-align:left;">
1015
+ Duster 360
1016
+ </td>
1017
+ <td style="text-align:right;">
1018
+ 14.3
1019
+ </td>
1020
+ <td style="text-align:right;">
1021
+ 8
1022
+ </td>
1023
+ <td style="text-align:right;">
1024
+ 360.0
1025
+ </td>
1026
+ <td style="text-align:right;">
1027
+ 245
1028
+ </td>
1029
+ <td style="text-align:right;">
1030
+ 3.21
1031
+ </td>
1032
+ <td style="text-align:right;">
1033
+ 3.570
1034
+ </td>
1035
+ <td style="text-align:right;">
1036
+ 15.84
1037
+ </td>
1038
+ <td style="text-align:right;">
1039
+ 0
1040
+ </td>
1041
+ <td style="text-align:right;">
1042
+ 0
1043
+ </td>
1044
+ <td style="text-align:right;">
1045
+ 3
1046
+ </td>
1047
+ <td style="text-align:right;">
1048
+ 4
1049
+ </td>
1050
+ </tr>
1051
+ <tr>
1052
+ <td style="text-align:left;">
1053
+ Merc 240D
1054
+ </td>
1055
+ <td style="text-align:right;">
1056
+ 24.4
1057
+ </td>
1058
+ <td style="text-align:right;">
1059
+ 4
1060
+ </td>
1061
+ <td style="text-align:right;">
1062
+ 146.7
1063
+ </td>
1064
+ <td style="text-align:right;">
1065
+ 62
1066
+ </td>
1067
+ <td style="text-align:right;">
1068
+ 3.69
1069
+ </td>
1070
+ <td style="text-align:right;">
1071
+ 3.190
1072
+ </td>
1073
+ <td style="text-align:right;">
1074
+ 20.00
1075
+ </td>
1076
+ <td style="text-align:right;">
1077
+ 1
1078
+ </td>
1079
+ <td style="text-align:right;">
1080
+ 0
1081
+ </td>
1082
+ <td style="text-align:right;">
1083
+ 4
1084
+ </td>
1085
+ <td style="text-align:right;">
1086
+ 2
1087
+ </td>
1088
+ </tr>
1089
+ <tr>
1090
+ <td style="text-align:left;">
1091
+ Merc 230
1092
+ </td>
1093
+ <td style="text-align:right;">
1094
+ 22.8
1095
+ </td>
1096
+ <td style="text-align:right;">
1097
+ 4
1098
+ </td>
1099
+ <td style="text-align:right;">
1100
+ 140.8
1101
+ </td>
1102
+ <td style="text-align:right;">
1103
+ 95
1104
+ </td>
1105
+ <td style="text-align:right;">
1106
+ 3.92
1107
+ </td>
1108
+ <td style="text-align:right;">
1109
+ 3.150
1110
+ </td>
1111
+ <td style="text-align:right;">
1112
+ 22.90
1113
+ </td>
1114
+ <td style="text-align:right;">
1115
+ 1
1116
+ </td>
1117
+ <td style="text-align:right;">
1118
+ 0
1119
+ </td>
1120
+ <td style="text-align:right;">
1121
+ 4
1122
+ </td>
1123
+ <td style="text-align:right;">
1124
+ 2
1125
+ </td>
1126
+ </tr>
1127
+ <tr>
1128
+ <td style="text-align:left;">
1129
+ Merc 280
1130
+ </td>
1131
+ <td style="text-align:right;">
1132
+ 19.2
1133
+ </td>
1134
+ <td style="text-align:right;">
1135
+ 6
1136
+ </td>
1137
+ <td style="text-align:right;">
1138
+ 167.6
1139
+ </td>
1140
+ <td style="text-align:right;">
1141
+ 123
1142
+ </td>
1143
+ <td style="text-align:right;">
1144
+ 3.92
1145
+ </td>
1146
+ <td style="text-align:right;">
1147
+ 3.440
1148
+ </td>
1149
+ <td style="text-align:right;">
1150
+ 18.30
1151
+ </td>
1152
+ <td style="text-align:right;">
1153
+ 1
1154
+ </td>
1155
+ <td style="text-align:right;">
1156
+ 0
1157
+ </td>
1158
+ <td style="text-align:right;">
1159
+ 4
1160
+ </td>
1161
+ <td style="text-align:right;">
1162
+ 4
1163
+ </td>
1164
+ </tr>
1165
+ <tr>
1166
+ <td style="text-align:left;">
1167
+ Merc 280C
1168
+ </td>
1169
+ <td style="text-align:right;">
1170
+ 17.8
1171
+ </td>
1172
+ <td style="text-align:right;">
1173
+ 6
1174
+ </td>
1175
+ <td style="text-align:right;">
1176
+ 167.6
1177
+ </td>
1178
+ <td style="text-align:right;">
1179
+ 123
1180
+ </td>
1181
+ <td style="text-align:right;">
1182
+ 3.92
1183
+ </td>
1184
+ <td style="text-align:right;">
1185
+ 3.440
1186
+ </td>
1187
+ <td style="text-align:right;">
1188
+ 18.90
1189
+ </td>
1190
+ <td style="text-align:right;">
1191
+ 1
1192
+ </td>
1193
+ <td style="text-align:right;">
1194
+ 0
1195
+ </td>
1196
+ <td style="text-align:right;">
1197
+ 4
1198
+ </td>
1199
+ <td style="text-align:right;">
1200
+ 4
1201
+ </td>
1202
+ </tr>
1203
+ <tr>
1204
+ <td style="text-align:left;">
1205
+ Merc 450SE
1206
+ </td>
1207
+ <td style="text-align:right;">
1208
+ 16.4
1209
+ </td>
1210
+ <td style="text-align:right;">
1211
+ 8
1212
+ </td>
1213
+ <td style="text-align:right;">
1214
+ 275.8
1215
+ </td>
1216
+ <td style="text-align:right;">
1217
+ 180
1218
+ </td>
1219
+ <td style="text-align:right;">
1220
+ 3.07
1221
+ </td>
1222
+ <td style="text-align:right;">
1223
+ 4.070
1224
+ </td>
1225
+ <td style="text-align:right;">
1226
+ 17.40
1227
+ </td>
1228
+ <td style="text-align:right;">
1229
+ 0
1230
+ </td>
1231
+ <td style="text-align:right;">
1232
+ 0
1233
+ </td>
1234
+ <td style="text-align:right;">
1235
+ 3
1236
+ </td>
1237
+ <td style="text-align:right;">
1238
+ 3
1239
+ </td>
1240
+ </tr>
1241
+ <tr>
1242
+ <td style="text-align:left;">
1243
+ Merc 450SL
1244
+ </td>
1245
+ <td style="text-align:right;">
1246
+ 17.3
1247
+ </td>
1248
+ <td style="text-align:right;">
1249
+ 8
1250
+ </td>
1251
+ <td style="text-align:right;">
1252
+ 275.8
1253
+ </td>
1254
+ <td style="text-align:right;">
1255
+ 180
1256
+ </td>
1257
+ <td style="text-align:right;">
1258
+ 3.07
1259
+ </td>
1260
+ <td style="text-align:right;">
1261
+ 3.730
1262
+ </td>
1263
+ <td style="text-align:right;">
1264
+ 17.60
1265
+ </td>
1266
+ <td style="text-align:right;">
1267
+ 0
1268
+ </td>
1269
+ <td style="text-align:right;">
1270
+ 0
1271
+ </td>
1272
+ <td style="text-align:right;">
1273
+ 3
1274
+ </td>
1275
+ <td style="text-align:right;">
1276
+ 3
1277
+ </td>
1278
+ </tr>
1279
+ <tr>
1280
+ <td style="text-align:left;">
1281
+ Merc 450SLC
1282
+ </td>
1283
+ <td style="text-align:right;">
1284
+ 15.2
1285
+ </td>
1286
+ <td style="text-align:right;">
1287
+ 8
1288
+ </td>
1289
+ <td style="text-align:right;">
1290
+ 275.8
1291
+ </td>
1292
+ <td style="text-align:right;">
1293
+ 180
1294
+ </td>
1295
+ <td style="text-align:right;">
1296
+ 3.07
1297
+ </td>
1298
+ <td style="text-align:right;">
1299
+ 3.780
1300
+ </td>
1301
+ <td style="text-align:right;">
1302
+ 18.00
1303
+ </td>
1304
+ <td style="text-align:right;">
1305
+ 0
1306
+ </td>
1307
+ <td style="text-align:right;">
1308
+ 0
1309
+ </td>
1310
+ <td style="text-align:right;">
1311
+ 3
1312
+ </td>
1313
+ <td style="text-align:right;">
1314
+ 3
1315
+ </td>
1316
+ </tr>
1317
+ <tr>
1318
+ <td style="text-align:left;">
1319
+ Cadillac Fleetwood
1320
+ </td>
1321
+ <td style="text-align:right;">
1322
+ 10.4
1323
+ </td>
1324
+ <td style="text-align:right;">
1325
+ 8
1326
+ </td>
1327
+ <td style="text-align:right;">
1328
+ 472.0
1329
+ </td>
1330
+ <td style="text-align:right;">
1331
+ 205
1332
+ </td>
1333
+ <td style="text-align:right;">
1334
+ 2.93
1335
+ </td>
1336
+ <td style="text-align:right;">
1337
+ 5.250
1338
+ </td>
1339
+ <td style="text-align:right;">
1340
+ 17.98
1341
+ </td>
1342
+ <td style="text-align:right;">
1343
+ 0
1344
+ </td>
1345
+ <td style="text-align:right;">
1346
+ 0
1347
+ </td>
1348
+ <td style="text-align:right;">
1349
+ 3
1350
+ </td>
1351
+ <td style="text-align:right;">
1352
+ 4
1353
+ </td>
1354
+ </tr>
1355
+ <tr>
1356
+ <td style="text-align:left;">
1357
+ Lincoln Continental
1358
+ </td>
1359
+ <td style="text-align:right;">
1360
+ 10.4
1361
+ </td>
1362
+ <td style="text-align:right;">
1363
+ 8
1364
+ </td>
1365
+ <td style="text-align:right;">
1366
+ 460.0
1367
+ </td>
1368
+ <td style="text-align:right;">
1369
+ 215
1370
+ </td>
1371
+ <td style="text-align:right;">
1372
+ 3.00
1373
+ </td>
1374
+ <td style="text-align:right;">
1375
+ 5.424
1376
+ </td>
1377
+ <td style="text-align:right;">
1378
+ 17.82
1379
+ </td>
1380
+ <td style="text-align:right;">
1381
+ 0
1382
+ </td>
1383
+ <td style="text-align:right;">
1384
+ 0
1385
+ </td>
1386
+ <td style="text-align:right;">
1387
+ 3
1388
+ </td>
1389
+ <td style="text-align:right;">
1390
+ 4
1391
+ </td>
1392
+ </tr>
1393
+ <tr>
1394
+ <td style="text-align:left;">
1395
+ Chrysler Imperial
1396
+ </td>
1397
+ <td style="text-align:right;">
1398
+ 14.7
1399
+ </td>
1400
+ <td style="text-align:right;">
1401
+ 8
1402
+ </td>
1403
+ <td style="text-align:right;">
1404
+ 440.0
1405
+ </td>
1406
+ <td style="text-align:right;">
1407
+ 230
1408
+ </td>
1409
+ <td style="text-align:right;">
1410
+ 3.23
1411
+ </td>
1412
+ <td style="text-align:right;">
1413
+ 5.345
1414
+ </td>
1415
+ <td style="text-align:right;">
1416
+ 17.42
1417
+ </td>
1418
+ <td style="text-align:right;">
1419
+ 0
1420
+ </td>
1421
+ <td style="text-align:right;">
1422
+ 0
1423
+ </td>
1424
+ <td style="text-align:right;">
1425
+ 3
1426
+ </td>
1427
+ <td style="text-align:right;">
1428
+ 4
1429
+ </td>
1430
+ </tr>
1431
+ <tr>
1432
+ <td style="text-align:left;">
1433
+ Fiat 128
1434
+ </td>
1435
+ <td style="text-align:right;">
1436
+ 32.4
1437
+ </td>
1438
+ <td style="text-align:right;">
1439
+ 4
1440
+ </td>
1441
+ <td style="text-align:right;">
1442
+ 78.7
1443
+ </td>
1444
+ <td style="text-align:right;">
1445
+ 66
1446
+ </td>
1447
+ <td style="text-align:right;">
1448
+ 4.08
1449
+ </td>
1450
+ <td style="text-align:right;">
1451
+ 2.200
1452
+ </td>
1453
+ <td style="text-align:right;">
1454
+ 19.47
1455
+ </td>
1456
+ <td style="text-align:right;">
1457
+ 1
1458
+ </td>
1459
+ <td style="text-align:right;">
1460
+ 1
1461
+ </td>
1462
+ <td style="text-align:right;">
1463
+ 4
1464
+ </td>
1465
+ <td style="text-align:right;">
1466
+ 1
1467
+ </td>
1468
+ </tr>
1469
+ <tr>
1470
+ <td style="text-align:left;">
1471
+ Honda Civic
1472
+ </td>
1473
+ <td style="text-align:right;">
1474
+ 30.4
1475
+ </td>
1476
+ <td style="text-align:right;">
1477
+ 4
1478
+ </td>
1479
+ <td style="text-align:right;">
1480
+ 75.7
1481
+ </td>
1482
+ <td style="text-align:right;">
1483
+ 52
1484
+ </td>
1485
+ <td style="text-align:right;">
1486
+ 4.93
1487
+ </td>
1488
+ <td style="text-align:right;">
1489
+ 1.615
1490
+ </td>
1491
+ <td style="text-align:right;">
1492
+ 18.52
1493
+ </td>
1494
+ <td style="text-align:right;">
1495
+ 1
1496
+ </td>
1497
+ <td style="text-align:right;">
1498
+ 1
1499
+ </td>
1500
+ <td style="text-align:right;">
1501
+ 4
1502
+ </td>
1503
+ <td style="text-align:right;">
1504
+ 2
1505
+ </td>
1506
+ </tr>
1507
+ <tr>
1508
+ <td style="text-align:left;">
1509
+ Toyota Corolla
1510
+ </td>
1511
+ <td style="text-align:right;">
1512
+ 33.9
1513
+ </td>
1514
+ <td style="text-align:right;">
1515
+ 4
1516
+ </td>
1517
+ <td style="text-align:right;">
1518
+ 71.1
1519
+ </td>
1520
+ <td style="text-align:right;">
1521
+ 65
1522
+ </td>
1523
+ <td style="text-align:right;">
1524
+ 4.22
1525
+ </td>
1526
+ <td style="text-align:right;">
1527
+ 1.835
1528
+ </td>
1529
+ <td style="text-align:right;">
1530
+ 19.90
1531
+ </td>
1532
+ <td style="text-align:right;">
1533
+ 1
1534
+ </td>
1535
+ <td style="text-align:right;">
1536
+ 1
1537
+ </td>
1538
+ <td style="text-align:right;">
1539
+ 4
1540
+ </td>
1541
+ <td style="text-align:right;">
1542
+ 1
1543
+ </td>
1544
+ </tr>
1545
+ <tr>
1546
+ <td style="text-align:left;">
1547
+ Toyota Corona
1548
+ </td>
1549
+ <td style="text-align:right;">
1550
+ 21.5
1551
+ </td>
1552
+ <td style="text-align:right;">
1553
+ 4
1554
+ </td>
1555
+ <td style="text-align:right;">
1556
+ 120.1
1557
+ </td>
1558
+ <td style="text-align:right;">
1559
+ 97
1560
+ </td>
1561
+ <td style="text-align:right;">
1562
+ 3.70
1563
+ </td>
1564
+ <td style="text-align:right;">
1565
+ 2.465
1566
+ </td>
1567
+ <td style="text-align:right;">
1568
+ 20.01
1569
+ </td>
1570
+ <td style="text-align:right;">
1571
+ 1
1572
+ </td>
1573
+ <td style="text-align:right;">
1574
+ 0
1575
+ </td>
1576
+ <td style="text-align:right;">
1577
+ 3
1578
+ </td>
1579
+ <td style="text-align:right;">
1580
+ 1
1581
+ </td>
1582
+ </tr>
1583
+ <tr>
1584
+ <td style="text-align:left;">
1585
+ Dodge Challenger
1586
+ </td>
1587
+ <td style="text-align:right;">
1588
+ 15.5
1589
+ </td>
1590
+ <td style="text-align:right;">
1591
+ 8
1592
+ </td>
1593
+ <td style="text-align:right;">
1594
+ 318.0
1595
+ </td>
1596
+ <td style="text-align:right;">
1597
+ 150
1598
+ </td>
1599
+ <td style="text-align:right;">
1600
+ 2.76
1601
+ </td>
1602
+ <td style="text-align:right;">
1603
+ 3.520
1604
+ </td>
1605
+ <td style="text-align:right;">
1606
+ 16.87
1607
+ </td>
1608
+ <td style="text-align:right;">
1609
+ 0
1610
+ </td>
1611
+ <td style="text-align:right;">
1612
+ 0
1613
+ </td>
1614
+ <td style="text-align:right;">
1615
+ 3
1616
+ </td>
1617
+ <td style="text-align:right;">
1618
+ 2
1619
+ </td>
1620
+ </tr>
1621
+ <tr>
1622
+ <td style="text-align:left;">
1623
+ AMC Javelin
1624
+ </td>
1625
+ <td style="text-align:right;">
1626
+ 15.2
1627
+ </td>
1628
+ <td style="text-align:right;">
1629
+ 8
1630
+ </td>
1631
+ <td style="text-align:right;">
1632
+ 304.0
1633
+ </td>
1634
+ <td style="text-align:right;">
1635
+ 150
1636
+ </td>
1637
+ <td style="text-align:right;">
1638
+ 3.15
1639
+ </td>
1640
+ <td style="text-align:right;">
1641
+ 3.435
1642
+ </td>
1643
+ <td style="text-align:right;">
1644
+ 17.30
1645
+ </td>
1646
+ <td style="text-align:right;">
1647
+ 0
1648
+ </td>
1649
+ <td style="text-align:right;">
1650
+ 0
1651
+ </td>
1652
+ <td style="text-align:right;">
1653
+ 3
1654
+ </td>
1655
+ <td style="text-align:right;">
1656
+ 2
1657
+ </td>
1658
+ </tr>
1659
+ <tr>
1660
+ <td style="text-align:left;">
1661
+ Camaro Z28
1662
+ </td>
1663
+ <td style="text-align:right;">
1664
+ 13.3
1665
+ </td>
1666
+ <td style="text-align:right;">
1667
+ 8
1668
+ </td>
1669
+ <td style="text-align:right;">
1670
+ 350.0
1671
+ </td>
1672
+ <td style="text-align:right;">
1673
+ 245
1674
+ </td>
1675
+ <td style="text-align:right;">
1676
+ 3.73
1677
+ </td>
1678
+ <td style="text-align:right;">
1679
+ 3.840
1680
+ </td>
1681
+ <td style="text-align:right;">
1682
+ 15.41
1683
+ </td>
1684
+ <td style="text-align:right;">
1685
+ 0
1686
+ </td>
1687
+ <td style="text-align:right;">
1688
+ 0
1689
+ </td>
1690
+ <td style="text-align:right;">
1691
+ 3
1692
+ </td>
1693
+ <td style="text-align:right;">
1694
+ 4
1695
+ </td>
1696
+ </tr>
1697
+ <tr>
1698
+ <td style="text-align:left;">
1699
+ Pontiac Firebird
1700
+ </td>
1701
+ <td style="text-align:right;">
1702
+ 19.2
1703
+ </td>
1704
+ <td style="text-align:right;">
1705
+ 8
1706
+ </td>
1707
+ <td style="text-align:right;">
1708
+ 400.0
1709
+ </td>
1710
+ <td style="text-align:right;">
1711
+ 175
1712
+ </td>
1713
+ <td style="text-align:right;">
1714
+ 3.08
1715
+ </td>
1716
+ <td style="text-align:right;">
1717
+ 3.845
1718
+ </td>
1719
+ <td style="text-align:right;">
1720
+ 17.05
1721
+ </td>
1722
+ <td style="text-align:right;">
1723
+ 0
1724
+ </td>
1725
+ <td style="text-align:right;">
1726
+ 0
1727
+ </td>
1728
+ <td style="text-align:right;">
1729
+ 3
1730
+ </td>
1731
+ <td style="text-align:right;">
1732
+ 2
1733
+ </td>
1734
+ </tr>
1735
+ <tr>
1736
+ <td style="text-align:left;">
1737
+ Fiat X1-9
1738
+ </td>
1739
+ <td style="text-align:right;">
1740
+ 27.3
1741
+ </td>
1742
+ <td style="text-align:right;">
1743
+ 4
1744
+ </td>
1745
+ <td style="text-align:right;">
1746
+ 79.0
1747
+ </td>
1748
+ <td style="text-align:right;">
1749
+ 66
1750
+ </td>
1751
+ <td style="text-align:right;">
1752
+ 4.08
1753
+ </td>
1754
+ <td style="text-align:right;">
1755
+ 1.935
1756
+ </td>
1757
+ <td style="text-align:right;">
1758
+ 18.90
1759
+ </td>
1760
+ <td style="text-align:right;">
1761
+ 1
1762
+ </td>
1763
+ <td style="text-align:right;">
1764
+ 1
1765
+ </td>
1766
+ <td style="text-align:right;">
1767
+ 4
1768
+ </td>
1769
+ <td style="text-align:right;">
1770
+ 1
1771
+ </td>
1772
+ </tr>
1773
+ <tr>
1774
+ <td style="text-align:left;">
1775
+ Porsche 914-2
1776
+ </td>
1777
+ <td style="text-align:right;">
1778
+ 26.0
1779
+ </td>
1780
+ <td style="text-align:right;">
1781
+ 4
1782
+ </td>
1783
+ <td style="text-align:right;">
1784
+ 120.3
1785
+ </td>
1786
+ <td style="text-align:right;">
1787
+ 91
1788
+ </td>
1789
+ <td style="text-align:right;">
1790
+ 4.43
1791
+ </td>
1792
+ <td style="text-align:right;">
1793
+ 2.140
1794
+ </td>
1795
+ <td style="text-align:right;">
1796
+ 16.70
1797
+ </td>
1798
+ <td style="text-align:right;">
1799
+ 0
1800
+ </td>
1801
+ <td style="text-align:right;">
1802
+ 1
1803
+ </td>
1804
+ <td style="text-align:right;">
1805
+ 5
1806
+ </td>
1807
+ <td style="text-align:right;">
1808
+ 2
1809
+ </td>
1810
+ </tr>
1811
+ <tr>
1812
+ <td style="text-align:left;">
1813
+ Lotus Europa
1814
+ </td>
1815
+ <td style="text-align:right;">
1816
+ 30.4
1817
+ </td>
1818
+ <td style="text-align:right;">
1819
+ 4
1820
+ </td>
1821
+ <td style="text-align:right;">
1822
+ 95.1
1823
+ </td>
1824
+ <td style="text-align:right;">
1825
+ 113
1826
+ </td>
1827
+ <td style="text-align:right;">
1828
+ 3.77
1829
+ </td>
1830
+ <td style="text-align:right;">
1831
+ 1.513
1832
+ </td>
1833
+ <td style="text-align:right;">
1834
+ 16.90
1835
+ </td>
1836
+ <td style="text-align:right;">
1837
+ 1
1838
+ </td>
1839
+ <td style="text-align:right;">
1840
+ 1
1841
+ </td>
1842
+ <td style="text-align:right;">
1843
+ 5
1844
+ </td>
1845
+ <td style="text-align:right;">
1846
+ 2
1847
+ </td>
1848
+ </tr>
1849
+ <tr>
1850
+ <td style="text-align:left;">
1851
+ Ford Pantera L
1852
+ </td>
1853
+ <td style="text-align:right;">
1854
+ 15.8
1855
+ </td>
1856
+ <td style="text-align:right;">
1857
+ 8
1858
+ </td>
1859
+ <td style="text-align:right;">
1860
+ 351.0
1861
+ </td>
1862
+ <td style="text-align:right;">
1863
+ 264
1864
+ </td>
1865
+ <td style="text-align:right;">
1866
+ 4.22
1867
+ </td>
1868
+ <td style="text-align:right;">
1869
+ 3.170
1870
+ </td>
1871
+ <td style="text-align:right;">
1872
+ 14.50
1873
+ </td>
1874
+ <td style="text-align:right;">
1875
+ 0
1876
+ </td>
1877
+ <td style="text-align:right;">
1878
+ 1
1879
+ </td>
1880
+ <td style="text-align:right;">
1881
+ 5
1882
+ </td>
1883
+ <td style="text-align:right;">
1884
+ 4
1885
+ </td>
1886
+ </tr>
1887
+ <tr>
1888
+ <td style="text-align:left;">
1889
+ Ferrari Dino
1890
+ </td>
1891
+ <td style="text-align:right;">
1892
+ 19.7
1893
+ </td>
1894
+ <td style="text-align:right;">
1895
+ 6
1896
+ </td>
1897
+ <td style="text-align:right;">
1898
+ 145.0
1899
+ </td>
1900
+ <td style="text-align:right;">
1901
+ 175
1902
+ </td>
1903
+ <td style="text-align:right;">
1904
+ 3.62
1905
+ </td>
1906
+ <td style="text-align:right;">
1907
+ 2.770
1908
+ </td>
1909
+ <td style="text-align:right;">
1910
+ 15.50
1911
+ </td>
1912
+ <td style="text-align:right;">
1913
+ 0
1914
+ </td>
1915
+ <td style="text-align:right;">
1916
+ 1
1917
+ </td>
1918
+ <td style="text-align:right;">
1919
+ 5
1920
+ </td>
1921
+ <td style="text-align:right;">
1922
+ 6
1923
+ </td>
1924
+ </tr>
1925
+ <tr>
1926
+ <td style="text-align:left;">
1927
+ Maserati Bora
1928
+ </td>
1929
+ <td style="text-align:right;">
1930
+ 15.0
1931
+ </td>
1932
+ <td style="text-align:right;">
1933
+ 8
1934
+ </td>
1935
+ <td style="text-align:right;">
1936
+ 301.0
1937
+ </td>
1938
+ <td style="text-align:right;">
1939
+ 335
1940
+ </td>
1941
+ <td style="text-align:right;">
1942
+ 3.54
1943
+ </td>
1944
+ <td style="text-align:right;">
1945
+ 3.570
1946
+ </td>
1947
+ <td style="text-align:right;">
1948
+ 14.60
1949
+ </td>
1950
+ <td style="text-align:right;">
1951
+ 0
1952
+ </td>
1953
+ <td style="text-align:right;">
1954
+ 1
1955
+ </td>
1956
+ <td style="text-align:right;">
1957
+ 5
1958
+ </td>
1959
+ <td style="text-align:right;">
1960
+ 8
1961
+ </td>
1962
+ </tr>
1963
+ <tr>
1964
+ <td style="text-align:left;">
1965
+ Volvo 142E
1966
+ </td>
1967
+ <td style="text-align:right;">
1968
+ 21.4
1969
+ </td>
1970
+ <td style="text-align:right;">
1971
+ 4
1972
+ </td>
1973
+ <td style="text-align:right;">
1974
+ 121.0
1975
+ </td>
1976
+ <td style="text-align:right;">
1977
+ 109
1978
+ </td>
1979
+ <td style="text-align:right;">
1980
+ 4.11
1981
+ </td>
1982
+ <td style="text-align:right;">
1983
+ 2.780
1984
+ </td>
1985
+ <td style="text-align:right;">
1986
+ 18.60
1987
+ </td>
1988
+ <td style="text-align:right;">
1989
+ 1
1990
+ </td>
1991
+ <td style="text-align:right;">
1992
+ 1
1993
+ </td>
1994
+ <td style="text-align:right;">
1995
+ 4
1996
+ </td>
1997
+ <td style="text-align:right;">
1998
+ 2
1999
+ </td>
2000
+ </tr>
2001
+ </tbody>
2002
+ </table>
2003
+ </div>
2004
+ <div id="including-ruby-files-in-a-chunk" class="section level3">
2005
+ <h3>Including Ruby files in a chunk</h3>
2006
+ <p>R is a language that was created to be easy and fast for statisticians to use. As far as I know, it was not a language to be used for developing large systems. Of course, there are large systems and libraries in R, but the focus of the language is for developing statistical models and distribute that to peers.</p>
2007
+ <p>Ruby on the other hand, is a language for large software development. Systems written in Ruby will have dozens, hundreds or even thousands of files. To document a large system with literate programming, we cannot expect the developer to add all the files in a single ‘.Rmd’ file. gKnit provides the ‘include’ chunk engine to include a Ruby file as if it had being typed in the ‘.Rmd’ file.</p>
2008
+ <p>To include a file, the following chunk should be created, where <filename> is the name of the file to be included and where the extension, if it is ‘.rb’, does not need to be added. If the ‘relative’ option is not included, then it is treated as TRUE. When ‘relative’ is true, ruby’s ‘require_relative’ semantics is used to load the file, when false, Ruby’s $LOAD_PATH is searched to find the file and it is ’require’d.</p>
2009
+ <pre><code>```{include &lt;filename&gt;, relative = &lt;TRUE/FALSE&gt;}
2010
+ ```</code></pre>
2011
+ <p>Bellow we include file ‘model.rb’, which is in the same directory of this blog.<br />
2012
+ This code uses R ‘caret’ package to split a dataset in a train and test sets. The ‘caret’ package is a very important a useful package for doing Data Analysis, it has hundreds of functions for all steps of the Data Analysis workflow. To use ‘caret’ just to split a dataset is like using the proverbial cannon to kill the fly. We use it here only to show that integrating Ruby and R and using even a very complex package as ‘caret’ is trivial with Galaaz.</p>
2013
+ <p>A word of advice: the ‘caret’ package has lots of dependencies and installing it in a Linux system is a time consuming operation. Method ‘R.install_and_loads’ will install the package if it is not already installed and can take a while.</p>
2014
+ <pre><code>```{include model}
2015
+ ```</code></pre>
2016
+ <pre class="include"><code>require 'galaaz'
2017
+
2018
+ # Loads the R 'caret' package. If not present, installs it
2019
+ R.install_and_loads 'caret'
2020
+
2021
+ class Model
2022
+
2023
+ attr_reader :data
2024
+ attr_reader :test
2025
+ attr_reader :train
2026
+
2027
+ #==========================================================
2028
+ #
2029
+ #==========================================================
2030
+
2031
+ def initialize(data, percent_train:, seed: 123)
2032
+
2033
+ R.set__seed(seed)
2034
+ @data = data
2035
+ @percent_train = percent_train
2036
+ @seed = seed
2037
+
2038
+ end
2039
+
2040
+ #==========================================================
2041
+ #
2042
+ #==========================================================
2043
+
2044
+ def partition(field)
2045
+
2046
+ train_index =
2047
+ R.createDataPartition(@data.send(field), p: @percet_train,
2048
+ list: false, times: 1)
2049
+ @train = @data[train_index, :all]
2050
+ @test = @data[-train_index, :all]
2051
+
2052
+ end
2053
+
2054
+ end
2055
+ </code></pre>
2056
+ <pre class="ruby"><code>mtcars = ~:mtcars
2057
+ model = Model.new(mtcars, percent_train: 0.8)
2058
+ model.partition(:mpg)
2059
+ puts model.train.head
2060
+ puts model.test.head</code></pre>
2061
+ <pre><code>## mpg cyl disp hp drat wt qsec vs am gear carb
2062
+ ## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
2063
+ ## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
2064
+ ## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
2065
+ ## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
2066
+ ## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
2067
+ ## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
2068
+ ## mpg cyl disp hp drat wt qsec vs am gear carb
2069
+ ## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2070
+ ## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
2071
+ ## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
2072
+ ## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
2073
+ ## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
2074
+ ## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3</code></pre>
2075
+ </div>
2076
+ <div id="documenting-gems" class="section level3">
2077
+ <h3>Documenting Gems</h3>
2078
+ <p>gKnit also allows developers to document and load files that are not in the same directory of the ‘.Rmd’ file.</p>
2079
+ <p>Here is an example of loading the ‘find.rb’ file from TruffleRuby. In this example, relative is set to FALSE, so Ruby will look for the file in its $LOAD_PATH, and the user does not need to no it’s directory.</p>
2080
+ <pre><code>```{include find, relative = FALSE}
2081
+ ```</code></pre>
2082
+ <pre class="include"><code># frozen_string_literal: true
2083
+ #
2084
+ # find.rb: the Find module for processing all files under a given directory.
2085
+ #
2086
+
2087
+ #
2088
+ # The +Find+ module supports the top-down traversal of a set of file paths.
2089
+ #
2090
+ # For example, to total the size of all files under your home directory,
2091
+ # ignoring anything in a &quot;dot&quot; directory (e.g. $HOME/.ssh):
2092
+ #
2093
+ # require 'find'
2094
+ #
2095
+ # total_size = 0
2096
+ #
2097
+ # Find.find(ENV[&quot;HOME&quot;]) do |path|
2098
+ # if FileTest.directory?(path)
2099
+ # if File.basename(path)[0] == ?.
2100
+ # Find.prune # Don't look any further into this directory.
2101
+ # else
2102
+ # next
2103
+ # end
2104
+ # else
2105
+ # total_size += FileTest.size(path)
2106
+ # end
2107
+ # end
2108
+ #
2109
+ module Find
2110
+
2111
+ #
2112
+ # Calls the associated block with the name of every file and directory listed
2113
+ # as arguments, then recursively on their subdirectories, and so on.
2114
+ #
2115
+ # Returns an enumerator if no block is given.
2116
+ #
2117
+ # See the +Find+ module documentation for an example.
2118
+ #
2119
+ def find(*paths, ignore_error: true) # :yield: path
2120
+ block_given? or return enum_for(__method__, *paths, ignore_error: ignore_error)
2121
+
2122
+ fs_encoding = Encoding.find(&quot;filesystem&quot;)
2123
+
2124
+ paths.collect!{|d| raise Errno::ENOENT, d unless File.exist?(d); d.dup}.each do |path|
2125
+ path = path.to_path if path.respond_to? :to_path
2126
+ enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
2127
+ ps = [path]
2128
+ while file = ps.shift
2129
+ catch(:prune) do
2130
+ yield file.dup.taint
2131
+ begin
2132
+ s = File.lstat(file)
2133
+ rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
2134
+ raise unless ignore_error
2135
+ next
2136
+ end
2137
+ if s.directory? then
2138
+ begin
2139
+ fs = Dir.children(file, encoding: enc)
2140
+ rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
2141
+ raise unless ignore_error
2142
+ next
2143
+ end
2144
+ fs.sort!
2145
+ fs.reverse_each {|f|
2146
+ f = File.join(file, f)
2147
+ ps.unshift f.untaint
2148
+ }
2149
+ end
2150
+ end
2151
+ end
2152
+ end
2153
+ nil
2154
+ end
2155
+
2156
+ #
2157
+ # Skips the current file or directory, restarting the loop with the next
2158
+ # entry. If the current file is a directory, that directory will not be
2159
+ # recursively entered. Meaningful only within the block associated with
2160
+ # Find::find.
2161
+ #
2162
+ # See the +Find+ module documentation for an example.
2163
+ #
2164
+ def prune
2165
+ throw :prune
2166
+ end
2167
+
2168
+ module_function :find, :prune
2169
+ end</code></pre>
2170
+ </div>
2171
+ </div>
2172
+ <div id="converting-to-pdf" class="section level2">
2173
+ <h2>Converting to PDF</h2>
2174
+ <p>One of the beauties of knitr is that the same input can be converted to many different outputs. One very useful format, is, of course, PDF. In order to converted an <strong>R markdown</strong> file to PDF it is necessary to have LaTeX installed on the system. We will not explain here how to install LaTeX as there are plenty of documents on the web showing how to proceed.</p>
2175
+ <p>gKnit comes with a simple LaTeX style file for gknitting this blog as a PDF document. Here is the Yaml header to generate this blog in PDF format instead of HTML:</p>
2176
+ <pre><code>---
2177
+ title: &quot;gKnit - Ruby and R Knitting with Galaaz in GraalVM&quot;
2178
+ author: &quot;Rodrigo Botafogo&quot;
2179
+ tags: [Galaaz, Ruby, R, TruffleRuby, FastR, GraalVM, knitr, gknit]
2180
+ date: &quot;29 October 2018&quot;
2181
+ output:
2182
+ pdf\_document:
2183
+ includes:
2184
+ in\_header: [&quot;../../sty/galaaz.sty&quot;]
2185
+ number\_sections: yes
2186
+ ---</code></pre>
2187
+ </div>
2188
+ </div>
2189
+ <div id="conclusion" class="section level1">
2190
+ <h1>Conclusion</h1>
2191
+ <p>In order to do reproducible research, one of the main basic tools needed is a systhem that allows “literate programming” where text, code and possibly a set of files can be compiled onto a report that can be easily distributed to peers. Peers should be able to use this same set of files to rerun the compilation by their own obtaining the exact same original report. gKnit is such a system for Ruby and R. It uses <strong>R Markdown</strong> to integrate text and code chunks, where code chunks can either be part of the <strong>R Markdwon</strong> file or be imported from files in the system. Ideally, in reproducible research, all the files needed to rebuild a report should be easilly packed together (in the same zipped directory) and distributed to peers for reexecution.</p>
2192
+ <p>One of the promises of Oracle’s GraalVM is that users/developers will be able to use the best tool for their task at hand, independently of the programming language the tool was written on. We developed and implemented Galaaz atop the GraalVM and Truffle interop messages and the time and effort to wrap Ruby over R - Galaaz - or to wrap Knitr with gKnit was a fraction of a fraction of a fraction (one man effort for a couple of hours a day, for approximately six months) of the time require to implement the original tools. Trying to reimplement all R packages in Ruby would require the same effort it is taking Python to implement NumPy, Pandas and all supporting libraries and it is unlikely that this effort would ever be done. GraalVM has allowed Ruby to profit “almost for free” from this huge set of libraries and tools that make R one of the most used languages for data analysis and machine learning.</p>
2193
+ <p>More interesting than wrapping the R libraries with Ruby, is that Ruby adds value to R, by allowing developers to use powerful and modern constructs for code reuse that are not the strong points of R. As shown in this blog, R and Ruby can easily communicate and R can be structured in classes and modules in a way that greatly expands its power and readability.</p>
2194
+ </div>
2195
+ <div id="installing-gknit" class="section level1">
2196
+ <h1>Installing gKnit</h1>
2197
+ <div id="prerequisites" class="section level2">
2198
+ <h2>Prerequisites</h2>
2199
+ <ul>
2200
+ <li>GraalVM (&gt;= rc8)</li>
2201
+ <li>TruffleRuby</li>
2202
+ <li>FastR</li>
2203
+ </ul>
2204
+ <p>The following R packages will be automatically installed when necessary, but could be installed prior to using gKnit if desired:</p>
2205
+ <ul>
2206
+ <li>ggplot2</li>
2207
+ <li>gridExtra</li>
2208
+ <li>knitr</li>
2209
+ </ul>
2210
+ <p>Installation of R packages requires a development environment and can be time consuming. In Linux, the gnu compiler and tools should be enough. I am not sure what is needed on the Mac.</p>
2211
+ </div>
2212
+ <div id="preparation" class="section level2">
2213
+ <h2>Preparation</h2>
2214
+ <ul>
2215
+ <li>gem install galaaz</li>
2216
+ </ul>
2217
+ </div>
2218
+ <div id="usage" class="section level2">
2219
+ <h2>Usage</h2>
2220
+ <ul>
2221
+ <li>gknit &lt;filename&gt;</li>
2222
+ </ul>
2223
+ </div>
2224
+ </div>
2225
+ <div id="references" class="section level1 unnumbered">
2226
+ <h1>References</h1>
2227
+ <div id="refs" class="references">
2228
+ <div id="ref-Knuth:literate_programming">
2229
+ <p>Knuth, Donald E. 1984. “Literate Programming.” <em>Comput. J.</em> 27 (2). Oxford, UK: Oxford University Press: 97–111. <a href="https://doi.org/10.1093/comjnl/27.2.97" class="uri">https://doi.org/10.1093/comjnl/27.2.97</a>.</p>
2230
+ </div>
2231
+ <div id="ref-Wilkinson:grammar_of_graphics">
2232
+ <p>Wilkinson, Leland. 2005. <em>The Grammar of Graphics (Statistics and Computing)</em>. Berlin, Heidelberg: Springer-Verlag.</p>
2233
+ </div>
370
2234
  </div>
371
2235
  </div>
372
2236