public this repo is viewable by everyone
Description: Ruby LaTeX to PDF preprocessor (and Rails plugin)
Homepage: http://rtex.rubyforge.org
Clone URL: git://github.com/bruce/rtex.git
Click here to lend your support to: rtex and make a donation at www.pledgie.com !
Basic manual/faq (webby) site
bruce (author)
23 days ago
commit  743635b21adcd72a5ab267785e24486cea6922e5
tree    5d146eaa34832980104e7a07005f5fbf9ffc7894
parent  6dd96a728c9af0a44fc9e7fbd136f27c52666faa
...
11
12
13
14
 
15
16
17
...
11
12
13
 
14
15
16
17
0
@@ -11,7 +11,7 @@
0
   
0
 == Usage
0
 
0
-Create files with +rtex+ or +pdf.rtex+ extensions (eg, +index.rtex+, +index.pdf.rtex+) using standard LaTeX markup.
0
+Create files +pdf.rtex+ extensions (eg, +index.pdf.rtex+) using standard LaTeX markup.
0
 
0
 * Layouts are supported, eg: +application.pdf.rtex+
0
 * Partials are supported, eg: +_item.pdf.rtex+
...
34
35
36
37
 
38
39
40
...
66
67
68
 
 
69
70
71
72
73
74
 
75
76
77
78
...
34
35
36
 
37
38
39
40
...
66
67
68
69
70
71
72
73
74
75
 
76
77
78
79
80
0
@@ -34,7 +34,7 @@ module RTeX
0
     def self.[](major, minor, tiny)
0
       new(major, minor, tiny)
0
     end
0
-
0
+
0
     attr_reader :major, :minor, :tiny
0
 
0
     # Create a new Version object with the given components.
0
@@ -66,12 +66,14 @@ module RTeX
0
     MAJOR = 1
0
     MINOR = 99
0
     TINY = 0
0
+
0
+ DESCRIPTION = '2.0 Preview 1'
0
 
0
     # The current version as a Version instance
0
     CURRENT = new(MAJOR, MINOR, TINY)
0
     # The current version as a String
0
     STRING = CURRENT.to_s
0
-
0
+
0
   end
0
   
0
 end
0
\ No newline at end of file
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0
@@ -0,0 +1,15 @@
0
+---
0
+title: Contact Us
0
+extension: html
0
+filter:
0
+- textile
0
+---
0
+
0
+
0
+h2. Version 2.0 Branch
0
+
0
+This is the Rails 2 compatible branch, includes the standalone @rtex@ executable, and is maintained by "Bruce Williams":http://codefluency.com (github: "bruce":http://github.com/bruce, email: _bruce at codefluency dot com_).
0
+
0
+h2. Version 1.0 Branch (Rails 1 compatible)
0
+
0
+This is the Rails 1 compatible branch and is maintained by Wiebe Cazemier (@contact info pending@).
0
\ No newline at end of file
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
0
@@ -0,0 +1,38 @@
0
+---
0
+title: Contribute to RTeX
0
+extension: html
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+Like any open source project, RTeX depends on the participation of the community to keep it up to date, relevant, and as usable as possible.
0
+
0
+h2. Where?
0
+
0
+The "RTeX source":http://github.com/bruce/rtex is hosted on "GitHub":http://github.com. Please contribute using GitHub if possible.
0
+
0
+h2. How to submit changes
0
+
0
+Here's the different ways you can send us changes (in descending order of desirability):
0
+
0
+* Fork the project in GitHub and send a pull request
0
+* Clone the project somewhere else, and "ask us":/contact to pull your changes from your publically accessible URL
0
+* Send us a git patch
0
+* Send us a manual patch (please note originating commit) if you don't use git
0
+* Send us an email detailing your changes
0
+* Scribble vague changes on a napkin and send COD
0
+
0
+h2. Get them accepted
0
+
0
+To get your changes accepted as fast as possible, the following really help:
0
+
0
+* Including a good reason for the change
0
+* Including good tests (failing before, passing after)
0
+* Making the code as backwards-compatible as possible
0
+* Using _generally accepted_ Ruby code conventions (yes, we know this is subjective)
0
+* Including good documentation
0
+
0
+<a id='docs' name='docs'></a>
0
+Note we _do_ accept documentation-only changes (even to this website, stored in @site/@ in the source!).
0
+
...
16
17
18
 
19
20
21
22
23
24
 
 
 
 
25
26
27
...
29
30
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
 
33
34
 
 
35
36
 
 
37
38
39
40
41
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
43
44
...
16
17
18
19
20
21
22
23
24
 
25
26
27
28
29
30
31
...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
0
@@ -16,12 +16,16 @@ color:
0
 ---
0
 
0
 body {
0
+ margin: 0;
0
   font-family: Verdana, "Bitstream Vera Sans", sans-serif;
0
 }
0
 
0
 /* Headings
0
  * --------------------------------------------------------------------- */
0
-h1,h2,h3,h4,h5,h6 { color: <%= @page.color['header'] %>; }
0
+#header, h1,h2,h3,h4,h5,h6 {
0
+ font-family: "Georgia", "Times New Roman", serif;
0
+ color: <%= @page.color['header'] %>;
0
+}
0
 
0
 /* Text Elements
0
  * --------------------------------------------------------------------- */
0
@@ -29,16 +33,60 @@ a { color: <%= @page.color['link'] %>; }
0
 a:hover { color: <%= @page.color['link-hover'] %>; }
0
 blockquote { color: <%= @page.color['blockquote'] %>; }
0
 
0
+a img { border: 0; }
0
+dt { font-weight: normal; }
0
+#license {
0
+ font-family: "Georgia", "Times New Roman", serif;
0
+ background: none;
0
+ border: 0;
0
+}
0
+
0
+#legacy {
0
+ font-size: 0.9em;
0
+ background: #ffffcc;
0
+ padding: 0;
0
+ text-align: center;
0
+ border-bottom: 1px #FFF5CC solid;
0
+ margin-bottom: 1em;
0
+}
0
+
0
+#legacy p {
0
+ padding: 4px;
0
+ margin: 0;
0
+}
0
+
0
 pre {
0
+ font-family: monospace;
0
   background: <%= @page.color['box-bg'] %>;
0
- border: 1px solid <%= @page.color['border'] %>;
0
+ padding: 1em;
0
+ font-size: 1.1em;
0
 }
0
 
0
+em { background: none; }
0
+
0
 hr {
0
   background: <%= @page.color['highlight'] %>;
0
   color: <%= @page.color['highlight'] %>;
0
 }
0
 
0
+#menu {
0
+ padding: 1em;
0
+ height: 100%;
0
+ font-size: 1.1em;
0
+ font-family: "Georgia", "Times New Roman", serif;
0
+}
0
+
0
+#release { height: 20px; padding: 0 0 0 1em; background: #e6e6e6; }
0
+#release * {
0
+ line-height: 20px;
0
+ vertical-align: middle;
0
+}
0
+#release dt {
0
+
0
+ float: left;
0
+ margin-right: 1em;
0
+}
0
+
0
 /* Tables
0
  * --------------------------------------------------------------------- */
0
 table {
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
0
@@ -0,0 +1,50 @@
0
+---
0
+title: Download
0
+extension: html
0
+filter:
0
+- erb
0
+- textile
0
+---
0
+
0
+The current stable version is *<%= stable_version %>*.
0
+
0
+The easiest (and recommended) way to install RTeX is by using "Rubygems":http://rubygems.org.
0
+
0
+ sudo gem install rtex
0
+
0
+For details on installation and use, see the "Manual":/manual.
0
+
0
+h2. Development
0
+
0
+Unstable code is available on the RTeX project's "GitHub page":http://github.com/bruce/rtex. If RTeX doesn't meet your needs or you find a bug, please "contribute":/contribute!
0
+
0
+h2. License
0
+
0
+Use it, change it, charge for it, give credit (more details below).
0
+
0
+<pre id='license'>
0
+(The MIT License)
0
+
0
+Copyright (c) 2006-2008 Bruce Williams, Wiebe Cazemier
0
+
0
+Permission is hereby granted, free of charge, to any person
0
+obtaining a copy of this software and associated documentation
0
+files (the "Software"), to deal in the Software without
0
+restriction, including without limitation the rights to use,
0
+copy, modify, merge, publish, distribute, sublicense, and/or sell
0
+copies of the Software, and to permit persons to whom the
0
+Software is furnished to do so, subject to the following
0
+conditions:
0
+
0
+The above copyright notice and this permission notice shall be
0
+included in all copies or substantial portions of the Software.
0
+
0
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
0
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
0
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0
+OTHER DEALINGS IN THE SOFTWARE.
0
+</pre>
0
\ No newline at end of file
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
0
@@ -0,0 +1,59 @@
0
+---
0
+title: Frequently Asked Questions
0
+extension: html
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+h2. What is RTeX?
0
+
0
+RTeX is a Ruby library (and web framework plugin) used to generate PDF documents on-the-fly using the "LaTeX typesetting system":http://www.latex-project.org/.
0
+
0
+h2. Is this a Rails plugin?
0
+
0
+Yes. No. Well, kinda.
0
+
0
+RTeX is a general-purpose Ruby library that _just happens_ to also act as Rails plugin. In the future it's intended to be used out-of-the-box with other frameworks as well. You can see the "Development Roadmap":/roadmap for some details on planned support.
0
+
0
+For details on how to install this _kinda_ Rails plugin into your app, see the "associated Manual page":/manual/install.html#rails.
0
+
0
+h2. Why _isn't_ this _just_ a Rails plugin?
0
+
0
+Because there's more to Ruby than Rails, and dependency resolution is a Good Thing. Rails 2.1 is set to support gem plugins by default, so installation should be even easier "in the future":/roadmap.
0
+
0
+h2. Why not use PDF::Writer, or _Some Other Library_
0
+
0
+PDF::Writer is a great library, and in many cases may be exactly what you need.
0
+
0
+Where RTeX really shines is when you have to do more advanced layout or typesetting that would be too tedious or error-prone to do manually in PDF::Writer.
0
+
0
+RTeX is simple Ruby wrapper on top of the very robust LaTeX project, which has been in development for over 20 years and is used for professional publishing the world-over. This is a complex wheel that has been long [and well] implemented; all RTeX does is allow you to use it more easily from Ruby and as a filter (in standalone-mode).
0
+
0
+h2(#latex). Isn't LaTeX hard to learn?
0
+
0
+Not really; just think of it as a markup language. While there are certainly some specialized areas (mathematical formulas, references, graphics layout, etc), the basic set of commands is easy to learn in a sitting.
0
+
0
+I'd recommend reading the _single-page_ "introduction by Mike Unwalla":http://www.techscribe.co.uk/ta/latex-introduction.pdf first, and then moving on to the "other guides":http://www.latex-project.org/guides/ that the LaTeX project provides. You'll pick it up!
0
+
0
+h2. What are RTeX's dependencies?
0
+
0
+Ruby 1.8, Rubygems, and a "LaTeX":http://www.latex-project.org/ distribution including the @pdflatex@ executable. Rails is obviously a dependency if attempting to use it as a plugin.
0
+
0
+h2. What if the documents I want to generate are too large to generate on-demand?
0
+
0
+Built-in support for this is being looked at as possibility for a "future release":/roadmap. In the meantime, the @rtex@ standalone executable can be happily used outside of Rails to process a backlog of documents... but at the moment you'll need to handle the queue processing yourself.
0
+
0
+Keep in mind LaTeX processes fairly lengthy documents well within the limits of a normal request (certainly faster than PDF::Writer). YMMV.
0
+
0
+h2. How do I request a feature or submit a bug?
0
+
0
+Feel free to "contact":/contact the maintainers.
0
+
0
+h2. I've fixed a bug or added an enhancement, how do I submit it?
0
+
0
+Please contribute through "normal channels":/contribute if possible.
0
+
0
+h2. What if I have a different question?
0
+
0
+See the "contact":/contact page and pass it along!
0
\ No newline at end of file
...
1
2
3
4
5
6
7
 
8
9
10
11
12
13
14
15
16
17
 
18
 
...
1
 
2
3
4
5
 
6
7
 
 
 
 
 
 
 
 
 
8
9
10
0
@@ -1,18 +1,10 @@
0
 ---
0
-title: Home Page
0
 filter:
0
   - erb
0
   - textile
0
 ---
0
-p(title). <%= @page.title %>
0
+h2. Welcome
0
 
0
-Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nunc congue ipsum vestibulum libero. Aenean vitae justo. Nam eget tellus. Etiam convallis, est eu lobortis mattis, lectus tellus tempus felis, a ultricies erat ipsum at metus.
0
-
0
-h2. Litora Sociis
0
-
0
-Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi et risus. Aliquam nisl. Nulla facilisi. Cras accumsan vestibulum ante. Vestibulum sed tortor. Praesent tempus fringilla elit. Ut elit diam, sagittis in, nonummy in, gravida non, nunc. Ut orci. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Nam egestas, orci eu imperdiet malesuada, nisl purus fringilla odio, quis commodo est orci vitae justo. Aliquam placerat odio tincidunt nulla. Cras in libero. Aenean rutrum, magna non tristique posuere, erat odio eleifend nisl, non convallis est tortor blandit ligula. Nulla id augue.
0
-
0
-bq. Nullam mattis, odio ut tempus facilisis, metus nisl facilisis metus, auctor consectetuer felis ligula nec mauris. Vestibulum odio erat, fermentum at, commodo vitae, ultrices et, urna. Mauris vulputate, mi pulvinar sagittis condimentum, sem nulla aliquam velit, sed imperdiet mi purus eu magna. Nulla varius metus ut eros. Aenean aliquet magna eget orci. Class aptent taciti sociosqu ad litora.
0
-
0
-Vivamus euismod. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse vel nibh ut turpis dictum sagittis. Aliquam vel velit a elit auctor sollicitudin. Nam vel dui vel neque lacinia pretium. Quisque nunc erat, venenatis id, volutpat ut, scelerisque sed, diam. Mauris ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec mattis. Morbi dignissim sollicitudin libero. Nulla lorem.
0
+RTeX is a Ruby library (and web framework plugin) used to generate PDF documents on-the-fly using the "LaTeX typesetting system":http://www.latex-project.org/.
0
 
0
+RTeX is maintained by Bruce Williams (creator, maintaining the v2, Rails 2 compatible branch) and Wiebe Cazemier (maintaining the v1, Rails 1 compatible branch). See the "contact":/contact page to reach them.
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0
@@ -0,0 +1,19 @@
0
+---
0
+title: RTeX Manual
0
+extension: html
0
+distry: true
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+This is a _growing_ set of documentation; please bear with us as it is expanded!
0
+
0
+h2. Topics
0
+
0
+<ol>
0
+ <% @pages.find(:limit => :all, :in_directory => 'manual', :sort_by => :position) do |p| %>
0
+ <% next if p == @page %>
0
+ <li><a href='<%= p.url %>'><%= p.title %></a></li>
0
+ <% end %>
0
+</ol>
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
0
@@ -0,0 +1,26 @@
0
+---
0
+title: Installing RTeX
0
+extension: html
0
+position: 1
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+h2(#gem). Installing the RTeX Rubygem
0
+
0
+The easiest (and recommended) way to install RTeX is by using "Rubygems":http://rubygems.org.
0
+
0
+ sudo gem install rtex
0
+
0
+The standalone executable, @rtex@, should not be available. For information on using the standalone executable, see the "RTeX Executable":/manual/rtex_executable page.
0
+
0
+h2(#rails). Installing the Rails plugin
0
+
0
+If you'd like to use RTeX as a Rails template handler, install it with:
0
+
0
+ rtex --install /path/to/your/app
0
+
0
+It's also possible to unpack the entire gem to @vendor/plugins/rtex@, but it's not recommended.
0
+
0
+For information on how to use RTeX from within your Rails application, see the "Rails page":/manual/rails.html.
0
\ No newline at end of file
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
0
@@ -0,0 +1,90 @@
0
+---
0
+title: RTeX as a Rails plugin
0
+extension: html
0
+position: 2
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+RTeX can be used as a "Template Handler," similar to "HAML":http://haml.hamptoncatlin.com/ or "Markaby":http://markaby.rubyforge.org/, but with PDFs being output.
0
+
0
+_Please note that much of this information is also available within @README_RAILS.rdoc@ inside the RTeX gem (and plugin, once installed into an app)._
0
+
0
+h2. Rails Version Dependency
0
+
0
+* >= 2.0.1
0
+
0
+h2. Usage
0
+
0
+Create files @pdf.rtex@ extensions (eg, @index.pdf.rtex@) using standard LaTeX markup.
0
+
0
+* Layouts are supported, eg: @application.pdf.rtex@
0
+* Partials are supported, eg: @_item.pdf.rtex@
0
+
0
+For information on learning LaTeX, see the related "FAQ entry":/faq/#latex.
0
+
0
+h3. Example
0
+
0
+With the following:
0
+
0
+h4. app/controllers/items_controller.rb
0
+
0
+<pre>
0
+<notextile>
0
+ def index
0
+ @items = Item.find(:all)
0
+ end
0
+</notextile>
0
+</pre>
0
+
0
+h4. app/views/items/index.pdf.rtex
0
+
0
+<pre>
0
+<notextile>
0
+ \section*{Items}
0
+ \begin{itemize}
0
+ &lt;%= render :partial => @items %&gt;
0
+ \end{itemize}
0
+</notextile>
0
+</pre>
0
+
0
+h4. app/views/items/_item.pdf.rtex
0
+
0
+<pre>
0
+<notextile>
0
+ \item &lt;%=l item.name %&gt; \\
0
+</notextile>
0
+</pre>
0
+
0
+h4. app/layouts/application.pdf.rtex
0
+
0
+<pre>
0
+<notextile>
0
+ \documentclass[12pt]{article}
0
+ \begin{document}
0
+ &lt;%= yield %&gt;
0
+ \end{document}
0
+</notextile>
0
+</pre>
0
+
0
+If you hit @http://the.server.url/items.pdf@, you end up with a nice PDF listing of items.
0
+
0
+_Note: This documentation "needs":/contribute/#docs significantly more complex/complete examples_
0
+
0
+h3. Customizing Options
0
+
0
+Note you can set certain options for RTeX by passing additional options to @render@. Here is a short list:
0
+
0
+<dl>
0
+ <dt>@:filename@</dt><dd>The name of the PDF the user will be prompted to download (otherwise it uses a filename based on the URL)</dd>
0
+ <dt>@:preprocess@ and @:preprocessor@</dt><dd>Whether to run the raw source through a preprocessor, and the executable to use (for generating TOCs, etc). Defaults are @false@ and @'latex'@, respectively.</dd>
0
+ <dt>@:processor@</dt><dd>The executable used for final generation (default: @'pdflatex'@); note this must currently produce a PDF file.</dd>
0
+ <dt>@:shell_redirect@</dt><dd>Additional string to be tacked onto system calls, generally used to redirect STDERR to keep logs clean, ie @'> /dev/null 2>&1'@) (default @nil@)</dd>
0
+ <dt>@:tmpdir@</dt><dd>The temporary directory to use (default @RAILS_ROOT/tmp@)
0
+</dl>
0
+
0
+
0
+
0
+
0
+
...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
0
@@ -0,0 +1,15 @@
0
+---
0
+title: Development Roadmap
0
+extension: html
0
+filter:
0
+ - erb
0
+ - textile
0
+---
0
+
0
+Here are some basic guidelines on the list of features and target releases.
0
+
0
+* Support for merb: 2.1
0
+* Support for sinatra: 2.1
0
+* Add queuing/offload support for asynchronous processing/notification: ?
0
+
0
+Have more ideas? "Contact":/contact us.
0
\ No newline at end of file
...
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
 
 
 
 
 
 
 
 
 
 
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
433
434
...
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
486
487
488
...
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632