template-ruby 0.5.6 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -4
  3. data/Gemfile.lock +15 -22
  4. data/lib/template/version.rb +1 -1
  5. data/lib/template-ruby.rb +2 -3
  6. data/lib/template.rb +18 -22
  7. data/spec/spec_helper.rb +0 -5
  8. data/spec/template_spec.rb +13 -0
  9. data/template-ruby.gemspec +2 -1
  10. metadata +34 -222
  11. data/.cherry.js +0 -21
  12. data/.editorconfig +0 -9
  13. data/.github/workflows/rspec.yml +0 -14
  14. data/.gitignore +0 -2
  15. data/.prettierrc +0 -3
  16. data/.tool-versions +0 -1
  17. data/CHANGELOG.md +0 -55
  18. data/LICENSE +0 -7
  19. data/README.md +0 -103
  20. data/TODO +0 -17
  21. data/bin/code +0 -76
  22. data/bin/format +0 -3
  23. data/bin/publish +0 -19
  24. data/bin/template +0 -85
  25. data/bin/test +0 -17
  26. data/code-ruby.gemspec +0 -17
  27. data/docs/class.code +0 -9
  28. data/docs/euler/1.template +0 -10
  29. data/docs/euler/2.template +0 -16
  30. data/docs/euler/3.template +0 -16
  31. data/docs/euler/4.template +0 -10
  32. data/docs/euler/5.template +0 -13
  33. data/docs/fibonnaci.template +0 -14
  34. data/docs/meetup.code +0 -12
  35. data/docs/precedence.template +0 -36
  36. data/docs/rain.code +0 -22
  37. data/docs/slack.code +0 -17
  38. data/docs/stripe.code +0 -7
  39. data/docs/twitter.code +0 -9
  40. data/language-ruby.gemspec +0 -17
  41. data/lib/code/error.rb +0 -18
  42. data/lib/code/node/base_10.rb +0 -29
  43. data/lib/code/node/base_16.rb +0 -13
  44. data/lib/code/node/base_2.rb +0 -13
  45. data/lib/code/node/base_8.rb +0 -13
  46. data/lib/code/node/boolean.rb +0 -22
  47. data/lib/code/node/call.rb +0 -47
  48. data/lib/code/node/call_argument.rb +0 -21
  49. data/lib/code/node/chained_call.rb +0 -23
  50. data/lib/code/node/code.rb +0 -20
  51. data/lib/code/node/decimal.rb +0 -26
  52. data/lib/code/node/dictionnary.rb +0 -33
  53. data/lib/code/node/equal.rb +0 -34
  54. data/lib/code/node/function.rb +0 -20
  55. data/lib/code/node/function_parameter.rb +0 -31
  56. data/lib/code/node/if.rb +0 -59
  57. data/lib/code/node/if_modifier.rb +0 -47
  58. data/lib/code/node/list.rb +0 -16
  59. data/lib/code/node/negation.rb +0 -15
  60. data/lib/code/node/not.rb +0 -15
  61. data/lib/code/node/nothing.rb +0 -12
  62. data/lib/code/node/number.rb +0 -25
  63. data/lib/code/node/operation.rb +0 -38
  64. data/lib/code/node/power.rb +0 -20
  65. data/lib/code/node/rescue.rb +0 -17
  66. data/lib/code/node/splat.rb +0 -15
  67. data/lib/code/node/statement.rb +0 -59
  68. data/lib/code/node/string.rb +0 -53
  69. data/lib/code/node/ternary.rb +0 -24
  70. data/lib/code/node/unary_minus.rb +0 -15
  71. data/lib/code/node/while.rb +0 -35
  72. data/lib/code/node.rb +0 -13
  73. data/lib/code/object/argument.rb +0 -32
  74. data/lib/code/object/boolean.rb +0 -27
  75. data/lib/code/object/decimal.rb +0 -162
  76. data/lib/code/object/dictionnary.rb +0 -96
  77. data/lib/code/object/function.rb +0 -64
  78. data/lib/code/object/global.rb +0 -42
  79. data/lib/code/object/integer.rb +0 -221
  80. data/lib/code/object/list.rb +0 -207
  81. data/lib/code/object/nothing.rb +0 -23
  82. data/lib/code/object/number.rb +0 -6
  83. data/lib/code/object/range.rb +0 -146
  84. data/lib/code/object/ruby_function.rb +0 -31
  85. data/lib/code/object/string.rb +0 -102
  86. data/lib/code/object.rb +0 -197
  87. data/lib/code/parser/addition.rb +0 -21
  88. data/lib/code/parser/and_operator.rb +0 -17
  89. data/lib/code/parser/bitwise_and.rb +0 -17
  90. data/lib/code/parser/bitwise_or.rb +0 -21
  91. data/lib/code/parser/boolean.rb +0 -17
  92. data/lib/code/parser/call.rb +0 -122
  93. data/lib/code/parser/chained_call.rb +0 -47
  94. data/lib/code/parser/class.rb +0 -45
  95. data/lib/code/parser/code.rb +0 -25
  96. data/lib/code/parser/dictionnary.rb +0 -67
  97. data/lib/code/parser/equal.rb +0 -94
  98. data/lib/code/parser/equality.rb +0 -35
  99. data/lib/code/parser/equality_lower.rb +0 -9
  100. data/lib/code/parser/function.rb +0 -85
  101. data/lib/code/parser/greater.rb +0 -25
  102. data/lib/code/parser/group.rb +0 -22
  103. data/lib/code/parser/if.rb +0 -63
  104. data/lib/code/parser/if_modifier.rb +0 -55
  105. data/lib/code/parser/list.rb +0 -42
  106. data/lib/code/parser/multiplication.rb +0 -25
  107. data/lib/code/parser/name.rb +0 -107
  108. data/lib/code/parser/negation.rb +0 -30
  109. data/lib/code/parser/not_keyword.rb +0 -23
  110. data/lib/code/parser/nothing.rb +0 -22
  111. data/lib/code/parser/number.rb +0 -154
  112. data/lib/code/parser/operation.rb +0 -35
  113. data/lib/code/parser/or_keyword.rb +0 -21
  114. data/lib/code/parser/or_operator.rb +0 -17
  115. data/lib/code/parser/power.rb +0 -43
  116. data/lib/code/parser/range.rb +0 -17
  117. data/lib/code/parser/rescue.rb +0 -39
  118. data/lib/code/parser/shift.rb +0 -21
  119. data/lib/code/parser/splat.rb +0 -31
  120. data/lib/code/parser/statement.rb +0 -9
  121. data/lib/code/parser/string.rb +0 -78
  122. data/lib/code/parser/ternary.rb +0 -46
  123. data/lib/code/parser/unary_minus.rb +0 -31
  124. data/lib/code/parser/while.rb +0 -36
  125. data/lib/code/parser/whitespace.rb +0 -49
  126. data/lib/code/parser.rb +0 -19
  127. data/lib/code/ruby.rb +0 -174
  128. data/lib/code-ruby.rb +0 -10
  129. data/lib/code.rb +0 -47
  130. data/lib/language/atom.rb +0 -342
  131. data/lib/language/output.rb +0 -130
  132. data/lib/language/parser/absent/present.rb +0 -8
  133. data/lib/language/parser/absent.rb +0 -6
  134. data/lib/language/parser/end_of_input.rb +0 -6
  135. data/lib/language/parser/interuption.rb +0 -38
  136. data/lib/language/parser/not_end_of_input.rb +0 -6
  137. data/lib/language/parser/str/not_found.rb +0 -16
  138. data/lib/language/parser/str.rb +0 -6
  139. data/lib/language/parser.rb +0 -53
  140. data/lib/language-ruby.rb +0 -10
  141. data/lib/language.rb +0 -80
  142. data/spec/code/addition_spec.rb +0 -13
  143. data/spec/code/and_operator_spec.rb +0 -13
  144. data/spec/code/bitwise_and_spec.rb +0 -13
  145. data/spec/code/bitwise_or_spec.rb +0 -13
  146. data/spec/code/boolean_spec.rb +0 -13
  147. data/spec/code/call_spec.rb +0 -21
  148. data/spec/code/chained_call_spec.rb +0 -16
  149. data/spec/code/code_spec.rb +0 -29
  150. data/spec/code/dictionnary_spec.rb +0 -17
  151. data/spec/code/equal_spec.rb +0 -26
  152. data/spec/code/equality_spec.rb +0 -13
  153. data/spec/code/function_spec.rb +0 -18
  154. data/spec/code/greater_spec.rb +0 -18
  155. data/spec/code/group_spec.rb +0 -12
  156. data/spec/code/if_modifier_spec.rb +0 -20
  157. data/spec/code/if_spec.rb +0 -25
  158. data/spec/code/list_spec.rb +0 -19
  159. data/spec/code/multiplication_spec.rb +0 -18
  160. data/spec/code/negation_spec.rb +0 -20
  161. data/spec/code/not_keyword_spec.rb +0 -13
  162. data/spec/code/nothing_spec.rb +0 -17
  163. data/spec/code/number_spec.rb +0 -22
  164. data/spec/code/or_keyword_spec.rb +0 -17
  165. data/spec/code/or_operator_spec.rb +0 -16
  166. data/spec/code/parser/boolean_spec.rb +0 -16
  167. data/spec/code/parser/call_spec.rb +0 -26
  168. data/spec/code/parser/chained_call.rb +0 -17
  169. data/spec/code/parser/dictionnary_spec.rb +0 -18
  170. data/spec/code/parser/function_spec.rb +0 -16
  171. data/spec/code/parser/group_spec.rb +0 -18
  172. data/spec/code/parser/list_spec.rb +0 -18
  173. data/spec/code/parser/number_spec.rb +0 -12
  174. data/spec/code/parser/string_spec.rb +0 -21
  175. data/spec/code/parser_spec.rb +0 -23
  176. data/spec/code/power_spec.rb +0 -13
  177. data/spec/code/range_spec.rb +0 -16
  178. data/spec/code/rescue_spec.rb +0 -13
  179. data/spec/code/shift_spec.rb +0 -13
  180. data/spec/code/splat_spec.rb +0 -13
  181. data/spec/code/string_spec.rb +0 -27
  182. data/spec/code/ternary_spec.rb +0 -18
  183. data/spec/code/unary_minus_spec.rb +0 -13
  184. data/spec/code/while_spec.rb +0 -18
@@ -1,154 +0,0 @@
1
- class Code
2
- class Parser
3
- class Number < Language
4
- def number
5
- ::Code::Parser::Number
6
- end
7
-
8
- def zero
9
- str("0")
10
- end
11
-
12
- def one
13
- str("1")
14
- end
15
-
16
- def two
17
- str("2")
18
- end
19
-
20
- def three
21
- str("3")
22
- end
23
-
24
- def four
25
- str("4")
26
- end
27
-
28
- def five
29
- str("5")
30
- end
31
-
32
- def six
33
- str("6")
34
- end
35
-
36
- def seven
37
- str("7")
38
- end
39
-
40
- def eight
41
- str("8")
42
- end
43
-
44
- def nine
45
- str("9")
46
- end
47
-
48
- def dot
49
- str(".")
50
- end
51
-
52
- def a
53
- str("a") | str("A")
54
- end
55
-
56
- def b
57
- str("b") | str("B")
58
- end
59
-
60
- def c
61
- str("c") | str("C")
62
- end
63
-
64
- def d
65
- str("d") | str("D")
66
- end
67
-
68
- def e
69
- str("e") | str("E")
70
- end
71
-
72
- def f
73
- str("f") | str("F")
74
- end
75
-
76
- def o
77
- str("o") | str("O")
78
- end
79
-
80
- def x
81
- str("x") | str("X")
82
- end
83
-
84
- def underscore
85
- str("_")
86
- end
87
-
88
- def base_16_digit
89
- zero | one | two | three | four | five | six | seven | eight | nine |
90
- a | b | c | d | e | f
91
- end
92
-
93
- def base_10_digit
94
- zero | one | two | three | four | five | six | seven | eight | nine
95
- end
96
-
97
- def base_8_digit
98
- zero | one | two | three | four | five | six | seven
99
- end
100
-
101
- def base_2_digit
102
- zero | one
103
- end
104
-
105
- def base_16_whole
106
- base_16_digit << (underscore.ignore | base_16_digit).repeat
107
- end
108
-
109
- def base_10_whole
110
- base_10_digit << (underscore.ignore | base_10_digit).repeat
111
- end
112
-
113
- def base_8_whole
114
- base_8_digit << (underscore.ignore | base_8_digit).repeat
115
- end
116
-
117
- def base_2_whole
118
- base_2_digit << (underscore.ignore | base_2_digit).repeat
119
- end
120
-
121
- def exponent
122
- (e << number).aka(:exponent)
123
- end
124
-
125
- def decimal
126
- (base_10_whole << dot << base_10_whole).aka(:decimal) << exponent.maybe
127
- end
128
-
129
- def base_16_number
130
- zero.ignore << x.ignore << base_16_whole
131
- end
132
-
133
- def base_10_number
134
- base_10_whole.aka(:whole) << exponent.maybe
135
- end
136
-
137
- def base_8_number
138
- zero.ignore << o.ignore << base_8_whole
139
- end
140
-
141
- def base_2_number
142
- zero.ignore << b.ignore << base_2_whole
143
- end
144
-
145
- def root
146
- (
147
- decimal.aka(:decimal) | base_16_number.aka(:base_16) |
148
- base_8_number.aka(:base_8) | base_2_number.aka(:base_2) |
149
- base_10_number.aka(:base_10)
150
- ).aka(:number) | ::Code::Parser::Boolean
151
- end
152
- end
153
- end
154
- end
@@ -1,35 +0,0 @@
1
- class Code
2
- class Parser
3
- class Operation < Language
4
- def statement
5
- raise NotImplementedError
6
- end
7
-
8
- def whitespace
9
- ::Code::Parser::Whitespace
10
- end
11
-
12
- def whitespace?
13
- whitespace.maybe
14
- end
15
-
16
- def operator
17
- raise NotImplementedError
18
- end
19
-
20
- def root
21
- (
22
- statement.aka(:first) <<
23
- (
24
- whitespace? << operator.aka(:operator) << whitespace? <<
25
- statement.aka(:statement)
26
- ).repeat(1).aka(:others).maybe
27
- )
28
- .aka(:operation)
29
- .then do |output|
30
- output[:operation][:others] ? output : output[:operation][:first]
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,21 +0,0 @@
1
- class Code
2
- class Parser
3
- class OrKeyword < Operation
4
- def statement
5
- ::Code::Parser::NotKeyword
6
- end
7
-
8
- def or_keyword
9
- str("or")
10
- end
11
-
12
- def and_keyword
13
- str("and")
14
- end
15
-
16
- def operator
17
- or_keyword | and_keyword
18
- end
19
- end
20
- end
21
- end
@@ -1,17 +0,0 @@
1
- class Code
2
- class Parser
3
- class OrOperator < Operation
4
- def statement
5
- ::Code::Parser::AndOperator
6
- end
7
-
8
- def pipe
9
- str("|")
10
- end
11
-
12
- def operator
13
- pipe << pipe
14
- end
15
- end
16
- end
17
- end
@@ -1,43 +0,0 @@
1
- class Code
2
- class Parser
3
- class Power < Language
4
- def power
5
- ::Code::Parser::Power
6
- end
7
-
8
- def statement
9
- ::Code::Parser::Negation
10
- end
11
-
12
- def whitespace
13
- ::Code::Parser::Whitespace
14
- end
15
-
16
- def whitespace?
17
- whitespace.maybe
18
- end
19
-
20
- def asterisk
21
- str("*")
22
- end
23
-
24
- def operator
25
- asterisk << asterisk
26
- end
27
-
28
- def root
29
- (
30
- statement.aka(:left) <<
31
- (
32
- whitespace? << operator.aka(:operator) << whitespace? <<
33
- power.aka(:right)
34
- ).maybe
35
- )
36
- .aka(:power)
37
- .then do |output|
38
- output[:power][:right] ? output : output[:power][:left]
39
- end
40
- end
41
- end
42
- end
43
- end
@@ -1,17 +0,0 @@
1
- class Code
2
- class Parser
3
- class Range < Operation
4
- def statement
5
- ::Code::Parser::OrOperator
6
- end
7
-
8
- def dot
9
- str(".")
10
- end
11
-
12
- def operator
13
- (dot << dot << dot) | (dot << dot)
14
- end
15
- end
16
- end
17
- end
@@ -1,39 +0,0 @@
1
- class Code
2
- class Parser
3
- class Rescue < Language
4
- def statement
5
- ::Code::Parser::Ternary
6
- end
7
-
8
- def rescue_class
9
- ::Code::Parser::Rescue
10
- end
11
-
12
- def whitespace
13
- ::Code::Parser::Whitespace
14
- end
15
-
16
- def whitespace?
17
- whitespace.maybe
18
- end
19
-
20
- def rescue_keyword
21
- str("rescue")
22
- end
23
-
24
- def root
25
- (
26
- statement.aka(:left) <<
27
- (
28
- whitespace? << rescue_keyword << whitespace? <<
29
- rescue_class.aka(:right)
30
- ).maybe
31
- )
32
- .aka(:rescue)
33
- .then do |output|
34
- output[:rescue][:right] ? output : output[:rescue][:left]
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,21 +0,0 @@
1
- class Code
2
- class Parser
3
- class Shift < Operation
4
- def statement
5
- ::Code::Parser::Addition
6
- end
7
-
8
- def greater
9
- str(">")
10
- end
11
-
12
- def lesser
13
- str("<")
14
- end
15
-
16
- def operator
17
- (greater << greater) | (lesser << lesser)
18
- end
19
- end
20
- end
21
- end
@@ -1,31 +0,0 @@
1
- class Code
2
- class Parser
3
- class Splat < Language
4
- def statement
5
- ::Code::Parser::Class
6
- end
7
-
8
- def splat
9
- ::Code::Parser::Splat
10
- end
11
-
12
- def whitespace
13
- ::Code::Parser::Whitespace
14
- end
15
-
16
- def whitespace?
17
- whitespace.maybe
18
- end
19
-
20
- def ampersand
21
- str("&")
22
- end
23
-
24
- def root
25
- (ampersand.aka(:operator) << whitespace? << splat.aka(:right)).aka(
26
- :splat
27
- ) | statement
28
- end
29
- end
30
- end
31
- end
@@ -1,9 +0,0 @@
1
- class Code
2
- class Parser
3
- class Statement < Language
4
- def root
5
- ::Code::Parser::Equality
6
- end
7
- end
8
- end
9
- end
@@ -1,78 +0,0 @@
1
- class Code
2
- class Parser
3
- class String < Language
4
- def code
5
- ::Code::Parser::Code
6
- end
7
-
8
- def name
9
- ::Code::Parser::Name
10
- end
11
-
12
- def single_quote
13
- str("'")
14
- end
15
-
16
- def double_quote
17
- str('"')
18
- end
19
-
20
- def backslash
21
- str("\\")
22
- end
23
-
24
- def opening_curly_bracket
25
- str("{")
26
- end
27
-
28
- def closing_curly_bracket
29
- str("}")
30
- end
31
-
32
- def colon
33
- str(":")
34
- end
35
-
36
- def code_part
37
- opening_curly_bracket << code << closing_curly_bracket.maybe
38
- end
39
-
40
- def single_quoted_text_part
41
- (
42
- backslash.ignore << opening_curly_bracket |
43
- backslash.ignore << single_quote |
44
- single_quote.absent << opening_curly_bracket.absent << any
45
- ).repeat(1)
46
- end
47
-
48
- def double_quoted_text_part
49
- (
50
- backslash.ignore << opening_curly_bracket |
51
- backslash.ignore << double_quote |
52
- double_quote.absent << opening_curly_bracket.absent << any
53
- ).repeat(1)
54
- end
55
-
56
- def single_quoted_string
57
- single_quote.ignore <<
58
- (code_part.aka(:code) | single_quoted_text_part.aka(:text)).repeat <<
59
- single_quote.ignore.maybe
60
- end
61
-
62
- def double_quoted_string
63
- double_quote.ignore <<
64
- (code_part.aka(:code) | double_quoted_text_part.aka(:text)).repeat <<
65
- double_quote.ignore.maybe
66
- end
67
-
68
- def symbol
69
- (colon.ignore << name).aka(:text).repeat(1, 1)
70
- end
71
-
72
- def root
73
- (single_quoted_string | double_quoted_string | symbol).aka(:string) |
74
- ::Code::Parser::Number
75
- end
76
- end
77
- end
78
- end
@@ -1,46 +0,0 @@
1
- class Code
2
- class Parser
3
- class Ternary < Language
4
- def statement
5
- ::Code::Parser::Range
6
- end
7
-
8
- def ternary
9
- ::Code::Parser::Ternary
10
- end
11
-
12
- def whitespace
13
- ::Code::Parser::Whitespace
14
- end
15
-
16
- def whitespace?
17
- whitespace.maybe
18
- end
19
-
20
- def question_mark
21
- str("?")
22
- end
23
-
24
- def colon
25
- str(":")
26
- end
27
-
28
- def root
29
- (
30
- statement.aka(:left) <<
31
- (
32
- whitespace? << question_mark << whitespace? <<
33
- ternary.aka(:middle) <<
34
- (
35
- whitespace? << colon << whitespace? << ternary.aka(:right)
36
- ).maybe
37
- ).maybe
38
- )
39
- .aka(:ternary)
40
- .then do |output|
41
- output[:ternary][:middle] ? output : output[:ternary][:left]
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,31 +0,0 @@
1
- class Code
2
- class Parser
3
- class UnaryMinus < Language
4
- def unary_minus
5
- ::Code::Parser::UnaryMinus
6
- end
7
-
8
- def whitespace
9
- ::Code::Parser::Whitespace
10
- end
11
-
12
- def whitespace?
13
- whitespace.maybe
14
- end
15
-
16
- def minus
17
- str("-")
18
- end
19
-
20
- def operator
21
- minus
22
- end
23
-
24
- def root
25
- (operator.aka(:operator) << whitespace? << unary_minus.aka(:right)).aka(
26
- :unary_minus
27
- ) | ::Code::Parser::Power
28
- end
29
- end
30
- end
31
- end
@@ -1,36 +0,0 @@
1
- class Code
2
- class Parser
3
- class While < Language
4
- def statement
5
- ::Code::Parser::If
6
- end
7
-
8
- def whitespace
9
- ::Code::Parser::Whitespace
10
- end
11
-
12
- def code
13
- ::Code::Parser::Code
14
- end
15
-
16
- def while_keyword
17
- str("while")
18
- end
19
-
20
- def until_keyword
21
- str("until")
22
- end
23
-
24
- def end_keyword
25
- str("end")
26
- end
27
-
28
- def root
29
- (
30
- (while_keyword | until_keyword).aka(:operator) << whitespace <<
31
- statement.aka(:statement) << code.aka(:body) << end_keyword.maybe
32
- ).aka(:while) | statement
33
- end
34
- end
35
- end
36
- end
@@ -1,49 +0,0 @@
1
- class Code
2
- class Parser
3
- class Whitespace < Language
4
- def space
5
- str(" ")
6
- end
7
-
8
- def newline
9
- str("\n")
10
- end
11
-
12
- def hashtag
13
- str("#")
14
- end
15
-
16
- def slash
17
- str("/")
18
- end
19
-
20
- def asterisk
21
- str("*")
22
- end
23
-
24
- def hash_comment
25
- hashtag << (newline.absent << any).repeat << newline.maybe
26
- end
27
-
28
- def double_slash_comment
29
- slash << slash << (newline.absent << any).repeat << newline.maybe
30
- end
31
-
32
- def multi_line_comment
33
- slash << asterisk << ((asterisk << slash).absent << any).repeat <<
34
- asterisk.maybe << slash.maybe
35
- end
36
-
37
- def without_newline
38
- (space | multi_line_comment).repeat(1)
39
- end
40
-
41
- def root
42
- (
43
- space | newline | hash_comment | double_slash_comment |
44
- multi_line_comment
45
- ).repeat(1)
46
- end
47
- end
48
- end
49
- end
data/lib/code/parser.rb DELETED
@@ -1,19 +0,0 @@
1
- class Code
2
- class Parser
3
- def initialize(input)
4
- @input = input
5
- end
6
-
7
- def self.parse(input)
8
- new(input).parse
9
- end
10
-
11
- def parse
12
- ::Code::Parser::Code.parse(input)
13
- end
14
-
15
- private
16
-
17
- attr_reader :input
18
- end
19
- end