expressir 0.2.27-x86-mingw32 → 1.0.0-x86-mingw32
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.
- checksums.yaml +4 -4
- data/.github/workflows/rake.yml +3 -3
- data/.gitignore +2 -2
- data/demo.rb +5 -5
- data/exe/format +8 -8
- data/exe/format-test +11 -11
- data/expressir.gemspec +0 -1
- data/lib/expressir.rb +0 -1
- data/lib/expressir/cli.rb +0 -6
- data/lib/expressir/{express_exp → express}/2.4/express_parser.so +0 -0
- data/lib/expressir/{express_exp → express}/2.5/express_parser.so +0 -0
- data/lib/expressir/{express_exp → express}/2.6/express_parser.so +0 -0
- data/lib/expressir/{express_exp → express}/2.7/express_parser.so +0 -0
- data/lib/expressir/{express_exp → express}/3.0/express_parser.so +0 -0
- data/lib/expressir/{express_exp → express}/cache.rb +3 -6
- data/lib/expressir/{express_exp → express}/formatter.rb +72 -66
- data/lib/expressir/{express_exp → express}/hyperlink_formatter.rb +1 -1
- data/lib/expressir/{express_exp → express}/model_visitor.rb +1 -1
- data/lib/expressir/{express_exp → express}/parser.rb +3 -3
- data/lib/expressir/{express_exp → express}/resolve_references_model_visitor.rb +2 -2
- data/lib/expressir/{express_exp → express}/schema_head_formatter.rb +1 -1
- data/lib/expressir/{express_exp → express}/visitor.rb +21 -25
- data/lib/expressir/model.rb +2 -2
- data/lib/expressir/model/entity.rb +6 -6
- data/lib/expressir/model/model_element.rb +1 -1
- data/lib/expressir/model/rule.rb +3 -3
- data/lib/expressir/model/type.rb +6 -6
- data/lib/expressir/model/types/enumeration.rb +2 -4
- data/lib/expressir/model/types/select.rb +2 -4
- data/lib/expressir/model/{unique.rb → unique_rule.rb} +1 -1
- data/lib/expressir/model/{where.rb → where_rule.rb} +1 -1
- data/lib/expressir/version.rb +1 -1
- data/rakelib/cross-ruby.rake +1 -1
- data/spec/expressir/{express_exp → express}/cache_spec.rb +9 -9
- data/spec/expressir/express/formatter_spec.rb +127 -0
- data/spec/expressir/{express_exp → express}/parser_spec.rb +23 -23
- data/spec/expressir/model/model_element_spec.rb +45 -45
- data/{original/examples → spec}/syntax/multiple.exp +0 -0
- data/{original/examples → spec}/syntax/multiple.yaml +4 -4
- data/{original/examples → spec}/syntax/multiple_formatted.exp +0 -0
- data/{original/examples → spec}/syntax/multiple_hyperlink_formatted.exp +0 -0
- data/{original/examples → spec}/syntax/multiple_schema_head_hyperlink_formatted.exp +0 -0
- data/{original/examples → spec}/syntax/remark.exp +0 -0
- data/{original/examples → spec}/syntax/remark.yaml +13 -13
- data/{original/examples → spec}/syntax/remark_formatted.exp +0 -0
- data/{original/examples → spec}/syntax/single.exp +0 -0
- data/{original/examples → spec}/syntax/single.yaml +1 -1
- data/{original/examples → spec}/syntax/single_formatted.exp +0 -0
- data/{original/examples → spec}/syntax/single_formatted.yaml +1 -1
- data/{original/examples → spec}/syntax/syntax.exp +10 -10
- data/{original/examples → spec}/syntax/syntax.yaml +106 -106
- data/{original/examples → spec}/syntax/syntax_formatted.exp +10 -10
- data/{original/examples → spec}/syntax/syntax_hyperlink_formatted.exp +10 -10
- data/{original/examples → spec}/syntax/syntax_schema_head_formatted.exp +0 -0
- metadata +37 -85
- data/lib/expressir/express.rb +0 -11
- data/lib/expressir/express/aggregate_dimension.rb +0 -38
- data/lib/expressir/express/attribute.rb +0 -15
- data/lib/expressir/express/comment.rb +0 -7
- data/lib/expressir/express/defined_type.rb +0 -36
- data/lib/expressir/express/derived.rb +0 -65
- data/lib/expressir/express/derived_aggregate.rb +0 -43
- data/lib/expressir/express/entity.rb +0 -137
- data/lib/expressir/express/explicit.rb +0 -70
- data/lib/expressir/express/explicit_aggregate.rb +0 -46
- data/lib/expressir/express/explicit_or_derived.rb +0 -16
- data/lib/expressir/express/global_rule.rb +0 -44
- data/lib/expressir/express/interface_specification.rb +0 -51
- data/lib/expressir/express/interfaced_item.rb +0 -38
- data/lib/expressir/express/inverse.rb +0 -46
- data/lib/expressir/express/inverse_aggregate.rb +0 -37
- data/lib/expressir/express/model_element.rb +0 -7
- data/lib/expressir/express/named_type.rb +0 -19
- data/lib/expressir/express/remark.rb +0 -8
- data/lib/expressir/express/repository.rb +0 -306
- data/lib/expressir/express/schema_definition.rb +0 -96
- data/lib/expressir/express/subtype_constraint.rb +0 -14
- data/lib/expressir/express/type.rb +0 -26
- data/lib/expressir/express/type_aggregate.rb +0 -42
- data/lib/expressir/express/type_enum.rb +0 -29
- data/lib/expressir/express/type_parser.rb +0 -45
- data/lib/expressir/express/type_select.rb +0 -82
- data/lib/expressir/express/unique_rule.rb +0 -35
- data/lib/expressir/express/where_rule.rb +0 -32
- data/lib/expressir/express_parser.rb +0 -30
- data/lib/expressir/parser.rb +0 -6
- data/lib/expressir/parser/owl_parser.rb +0 -8
- data/spec/acceptance/express_to_owl_spec.rb +0 -18
- data/spec/expressir/express/repository_spec.rb +0 -25
- data/spec/expressir/express_exp/formatter_spec.rb +0 -127
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 84e02857a08c830d2a37eb62823db7798bd5e52bfb990508694ef7e63284413a
|
4
|
+
data.tar.gz: d9ec87bbdd174c685463f8b507d00f1ae2ea0ff2f72cce87cea509b1914045d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7d37662b35953c9b0712b2947cf1550fbd4e3d9179bcd27fb54171e309dd48d8530cb939e765755eeb63959886ddf2030e71e27b5cac5b9f16e1f68a5ec42bee
|
7
|
+
data.tar.gz: b22d68cc8c259786a3f36c261ee4a5d3d8991d7c43649f1c703de43910ee70a2bd41cfb81763a642ffa0f53b9cad21eaeb9c21c2b63ca52dcba364b358b9db6e
|
data/.github/workflows/rake.yml
CHANGED
@@ -42,10 +42,10 @@ jobs:
|
|
42
42
|
|
43
43
|
- uses: actions/cache@v2
|
44
44
|
with:
|
45
|
-
path: lib/expressir/
|
46
|
-
key:
|
45
|
+
path: lib/expressir/express/express_parser.*
|
46
|
+
key: v4-${{ runner.os }}-${{ matrix.ruby }}-${{ hashFiles('ext/express-parser/extconf.rb', 'ext/express-parser/antlrgen/**', 'ext/express-parser/express_parser.cpp', '.git/modules/ext/express-parser/antlr4-upstream/HEAD') }}
|
47
47
|
|
48
|
-
- if: hashFiles('lib/expressir/
|
48
|
+
- if: hashFiles('lib/expressir/express/express_parser.*') == ''
|
49
49
|
run: bundle exec rake compile
|
50
50
|
|
51
51
|
- run: bundle exec rake
|
data/.gitignore
CHANGED
data/demo.rb
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'expressir'
|
4
|
-
require 'expressir/
|
4
|
+
require 'expressir/express/parser'
|
5
5
|
|
6
6
|
# This file is from:
|
7
7
|
# https://github.com/metanorma/annotated-express/blob/master/data/resources/action_schema/action_schema.exp
|
8
8
|
file = 'action_schema.exp'
|
9
9
|
|
10
|
-
# repo = Expressir::
|
10
|
+
# repo = Expressir::Express::Parser.from_exp(file)
|
11
11
|
# schema = repo.schemas.find{|schema| schema.id == "support_resource_schema"}
|
12
12
|
|
13
|
-
repo = Expressir::
|
13
|
+
repo = Expressir::Express::Parser.from_exp(file)
|
14
14
|
schema = repo.schemas.find{|schema| schema.id == "action_schema"}
|
15
15
|
entity = schema.entities.find{|entity| entity.id == "action_directive_relationship"}
|
16
|
-
|
16
|
+
where_rule = entity.where_rules.find{|where_rule| where_rule.id == "WR1"}
|
17
17
|
|
18
|
-
puts
|
18
|
+
puts where_rule.inspect
|
data/exe/format
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require "yaml"
|
4
|
-
require "expressir/
|
5
|
-
require "expressir/
|
6
|
-
require "expressir/
|
7
|
-
require "expressir/
|
4
|
+
require "expressir/express/parser"
|
5
|
+
require "expressir/express/formatter"
|
6
|
+
require "expressir/express/schema_head_formatter"
|
7
|
+
require "expressir/express/hyperlink_formatter"
|
8
8
|
|
9
9
|
exp_files = ARGV
|
10
10
|
|
11
|
-
repository = Expressir::
|
12
|
-
formatter = Class.new(Expressir::
|
13
|
-
include Expressir::
|
14
|
-
include Expressir::
|
11
|
+
repository = Expressir::Express::Parser.from_files(exp_files)
|
12
|
+
formatter = Class.new(Expressir::Express::Formatter) do
|
13
|
+
include Expressir::Express::SchemaHeadFormatter
|
14
|
+
include Expressir::Express::HyperlinkFormatter
|
15
15
|
end
|
16
16
|
result = repository.to_hash(formatter: formatter, skip_empty: true)
|
17
17
|
|
data/exe/format-test
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
|
3
3
|
require "yaml"
|
4
4
|
require "tempfile"
|
5
|
-
require "expressir/
|
6
|
-
require "expressir/
|
7
|
-
require "expressir/
|
8
|
-
require "expressir/
|
9
|
-
require "expressir/
|
5
|
+
require "expressir/express/parser"
|
6
|
+
require "expressir/express/formatter"
|
7
|
+
require "expressir/express/schema_head_formatter"
|
8
|
+
require "expressir/express/hyperlink_formatter"
|
9
|
+
require "expressir/express/cache"
|
10
10
|
|
11
11
|
exp_files = [
|
12
12
|
# basic test
|
@@ -53,17 +53,17 @@ exp_files = [
|
|
53
53
|
]
|
54
54
|
|
55
55
|
start = Time.now
|
56
|
-
repository = Expressir::
|
56
|
+
repository = Expressir::Express::Parser.from_files(exp_files)
|
57
57
|
puts "Parser.from_files time: #{(Time.now - start).round(2)}s"
|
58
58
|
|
59
59
|
temp_file = Tempfile.new
|
60
60
|
begin
|
61
61
|
start = Time.now
|
62
|
-
Expressir::
|
62
|
+
Expressir::Express::Cache.to_file(temp_file, repository)
|
63
63
|
puts "Cache.to_file time: #{(Time.now - start).round(2)}s"
|
64
64
|
|
65
65
|
start = Time.now
|
66
|
-
repository = Expressir::
|
66
|
+
repository = Expressir::Express::Cache.from_file(temp_file)
|
67
67
|
puts "Cache.from_file time: #{(Time.now - start).round(2)}s"
|
68
68
|
ensure
|
69
69
|
temp_file.close
|
@@ -71,9 +71,9 @@ ensure
|
|
71
71
|
end
|
72
72
|
|
73
73
|
start = Time.now
|
74
|
-
formatter = Class.new(Expressir::
|
75
|
-
include Expressir::
|
76
|
-
include Expressir::
|
74
|
+
formatter = Class.new(Expressir::Express::Formatter) do
|
75
|
+
include Expressir::Express::SchemaHeadFormatter
|
76
|
+
include Expressir::Express::HyperlinkFormatter
|
77
77
|
end
|
78
78
|
result = repository.to_hash(formatter: formatter, skip_empty: true)
|
79
79
|
puts "Repository.to_hash time: #{(Time.now - start).round(2)}s"
|
data/expressir.gemspec
CHANGED
@@ -30,7 +30,6 @@ Gem::Specification.new do |spec|
|
|
30
30
|
|
31
31
|
spec.extensions = File.join(*%w(ext express-parser extconf.rb))
|
32
32
|
|
33
|
-
spec.add_runtime_dependency "nokogiri", "~> 1.10"
|
34
33
|
spec.add_runtime_dependency "thor", "~> 1.0"
|
35
34
|
spec.add_runtime_dependency "rice", "~> 3"
|
36
35
|
spec.add_development_dependency "antlr4-native", "~> 1.1.0"
|
data/lib/expressir.rb
CHANGED
data/lib/expressir/cli.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "thor"
|
2
2
|
require "expressir/cli/ui"
|
3
|
-
require "expressir/express_parser"
|
4
3
|
|
5
4
|
module Expressir
|
6
5
|
module Cli
|
@@ -17,11 +16,6 @@ module Expressir
|
|
17
16
|
def version
|
18
17
|
Cli.ui.say("Version #{Expressir::VERSION}")
|
19
18
|
end
|
20
|
-
|
21
|
-
desc "express-to-owl FILE", "Express to OWL conversion"
|
22
|
-
def express_to_owl(file)
|
23
|
-
Cli.ui.say(ExpressParser.to_owl(file))
|
24
|
-
end
|
25
19
|
end
|
26
20
|
end
|
27
21
|
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -3,7 +3,7 @@ require 'zlib'
|
|
3
3
|
require 'expressir/model'
|
4
4
|
|
5
5
|
module Expressir
|
6
|
-
module
|
6
|
+
module Express
|
7
7
|
class Cache
|
8
8
|
def self.to_file(file, content, options = {})
|
9
9
|
root_path = options[:root_path]
|
@@ -16,7 +16,7 @@ module Expressir
|
|
16
16
|
content: content
|
17
17
|
})
|
18
18
|
|
19
|
-
hash = cache.to_hash(root_path: root_path
|
19
|
+
hash = cache.to_hash(root_path: root_path)
|
20
20
|
yaml = YAML.dump(hash)
|
21
21
|
yaml_compressed = Zlib::Deflate.deflate(yaml)
|
22
22
|
|
@@ -35,14 +35,11 @@ module Expressir
|
|
35
35
|
cache = Model::ModelElement.from_hash(hash, root_path: root_path)
|
36
36
|
|
37
37
|
if cache.version != version
|
38
|
-
raise
|
38
|
+
raise Error.new("Cache version mismatch, cache version is #{cache.version}, Expressir version is #{version}")
|
39
39
|
end
|
40
40
|
|
41
41
|
cache.content
|
42
42
|
end
|
43
43
|
end
|
44
|
-
|
45
|
-
class CacheLoadError < StandardError
|
46
|
-
end
|
47
44
|
end
|
48
45
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'expressir/model'
|
2
2
|
|
3
3
|
module Expressir
|
4
|
-
module
|
4
|
+
module Express
|
5
5
|
class Formatter
|
6
6
|
INDENT_CHAR = ' '
|
7
7
|
INDENT_WIDTH = 2
|
@@ -68,12 +68,12 @@ module Expressir
|
|
68
68
|
format_subtype_constraint(node)
|
69
69
|
elsif node.is_a? Model::Type
|
70
70
|
format_type(node)
|
71
|
-
elsif node.is_a? Model::
|
72
|
-
|
71
|
+
elsif node.is_a? Model::UniqueRule
|
72
|
+
format_unique_rule(node)
|
73
73
|
elsif node.is_a? Model::Variable
|
74
74
|
format_variable(node)
|
75
|
-
elsif node.is_a? Model::
|
76
|
-
|
75
|
+
elsif node.is_a? Model::WhereRule
|
76
|
+
format_where_rule(node)
|
77
77
|
elsif node.is_a? Model::Expressions::AggregateInitializer
|
78
78
|
format_expressions_aggregate_initializer(node)
|
79
79
|
elsif node.is_a? Model::Expressions::AggregateItem
|
@@ -316,16 +316,16 @@ module Expressir
|
|
316
316
|
indent(inverse_attributes.map{|x| format(x)}.join("\n")),
|
317
317
|
]
|
318
318
|
end,
|
319
|
-
*if node.
|
319
|
+
*if node.unique_rules.length > 0
|
320
320
|
[
|
321
321
|
'UNIQUE',
|
322
|
-
indent(node.
|
322
|
+
indent(node.unique_rules.map{|x| format(x)}.join("\n"))
|
323
323
|
]
|
324
324
|
end,
|
325
|
-
*if node.
|
325
|
+
*if node.where_rules.length > 0
|
326
326
|
[
|
327
327
|
'WHERE',
|
328
|
-
indent(node.
|
328
|
+
indent(node.where_rules.map{|x| format(x)}.join("\n")),
|
329
329
|
]
|
330
330
|
end,
|
331
331
|
[
|
@@ -576,10 +576,10 @@ module Expressir
|
|
576
576
|
*if node.statements.length > 0
|
577
577
|
indent(node.statements.map{|x| format(x)}.join("\n"))
|
578
578
|
end,
|
579
|
-
*if node.
|
579
|
+
*if node.where_rules.length > 0
|
580
580
|
[
|
581
581
|
'WHERE',
|
582
|
-
indent(node.
|
582
|
+
indent(node.where_rules.map{|x| format(x)}.join("\n"))
|
583
583
|
]
|
584
584
|
end,
|
585
585
|
[
|
@@ -720,13 +720,13 @@ module Expressir
|
|
720
720
|
' ',
|
721
721
|
'=',
|
722
722
|
' ',
|
723
|
-
format(node.
|
723
|
+
format(node.underlying_type),
|
724
724
|
';',
|
725
725
|
].join(''),
|
726
|
-
*if node.
|
726
|
+
*if node.where_rules.length > 0
|
727
727
|
[
|
728
728
|
'WHERE',
|
729
|
-
indent(node.
|
729
|
+
indent(node.where_rules.map{|x| format(x)}.join("\n"))
|
730
730
|
]
|
731
731
|
end,
|
732
732
|
[
|
@@ -736,7 +736,7 @@ module Expressir
|
|
736
736
|
].join("\n")
|
737
737
|
end
|
738
738
|
|
739
|
-
def
|
739
|
+
def format_unique_rule(node)
|
740
740
|
[
|
741
741
|
*if node.id
|
742
742
|
[
|
@@ -769,7 +769,7 @@ module Expressir
|
|
769
769
|
].join('')
|
770
770
|
end
|
771
771
|
|
772
|
-
def
|
772
|
+
def format_where_rule(node)
|
773
773
|
[
|
774
774
|
*if node.id
|
775
775
|
[
|
@@ -1299,38 +1299,41 @@ module Expressir
|
|
1299
1299
|
].join('')
|
1300
1300
|
end,
|
1301
1301
|
'ENUMERATION',
|
1302
|
-
*if node.
|
1303
|
-
item_indent = INDENT_CHAR * '('.length
|
1304
|
-
[
|
1305
|
-
' ',
|
1306
|
-
'OF',
|
1307
|
-
"\n",
|
1308
|
-
indent([
|
1309
|
-
'(',
|
1310
|
-
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1311
|
-
')'
|
1312
|
-
].join(''))
|
1313
|
-
].join('')
|
1314
|
-
end,
|
1315
|
-
*if node.extension_type
|
1302
|
+
*if node.based_on
|
1316
1303
|
[
|
1317
1304
|
' ',
|
1318
1305
|
'BASED_ON',
|
1319
1306
|
' ',
|
1320
|
-
format(node.
|
1307
|
+
format(node.based_on),
|
1308
|
+
*if node.items.length > 0
|
1309
|
+
item_indent = INDENT_CHAR * '('.length
|
1310
|
+
[
|
1311
|
+
' ',
|
1312
|
+
'WITH',
|
1313
|
+
"\n",
|
1314
|
+
indent([
|
1315
|
+
'(',
|
1316
|
+
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1317
|
+
')'
|
1318
|
+
].join(''))
|
1319
|
+
].join('')
|
1320
|
+
end
|
1321
1321
|
].join('')
|
1322
|
-
|
1323
|
-
*if node.extension_items.length > 0
|
1324
|
-
item_indent = INDENT_CHAR * '('.length
|
1322
|
+
else
|
1325
1323
|
[
|
1326
|
-
|
1327
|
-
|
1328
|
-
|
1329
|
-
|
1330
|
-
|
1331
|
-
|
1332
|
-
|
1333
|
-
|
1324
|
+
*if node.items.length > 0
|
1325
|
+
item_indent = INDENT_CHAR * '('.length
|
1326
|
+
[
|
1327
|
+
' ',
|
1328
|
+
'OF',
|
1329
|
+
"\n",
|
1330
|
+
indent([
|
1331
|
+
'(',
|
1332
|
+
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1333
|
+
')'
|
1334
|
+
].join(''))
|
1335
|
+
].join('')
|
1336
|
+
end
|
1334
1337
|
].join('')
|
1335
1338
|
end
|
1336
1339
|
].join('')
|
@@ -1427,36 +1430,39 @@ module Expressir
|
|
1427
1430
|
].join('')
|
1428
1431
|
end,
|
1429
1432
|
'SELECT',
|
1430
|
-
*if node.
|
1431
|
-
item_indent = INDENT_CHAR * '('.length
|
1432
|
-
[
|
1433
|
-
"\n",
|
1434
|
-
indent([
|
1435
|
-
'(',
|
1436
|
-
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1437
|
-
')'
|
1438
|
-
].join(''))
|
1439
|
-
].join('')
|
1440
|
-
end,
|
1441
|
-
*if node.extension_type
|
1433
|
+
*if node.based_on
|
1442
1434
|
[
|
1443
1435
|
' ',
|
1444
1436
|
'BASED_ON',
|
1445
1437
|
' ',
|
1446
|
-
format(node.
|
1438
|
+
format(node.based_on),
|
1439
|
+
*if node.items.length > 0
|
1440
|
+
item_indent = INDENT_CHAR * '('.length
|
1441
|
+
[
|
1442
|
+
' ',
|
1443
|
+
'WITH',
|
1444
|
+
"\n",
|
1445
|
+
indent([
|
1446
|
+
'(',
|
1447
|
+
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1448
|
+
')'
|
1449
|
+
].join(''))
|
1450
|
+
].join('')
|
1451
|
+
end
|
1447
1452
|
].join('')
|
1448
|
-
|
1449
|
-
*if node.extension_items.length > 0
|
1450
|
-
item_indent = INDENT_CHAR * '('.length
|
1453
|
+
else
|
1451
1454
|
[
|
1452
|
-
|
1453
|
-
|
1454
|
-
|
1455
|
-
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
|
1455
|
+
*if node.items.length > 0
|
1456
|
+
item_indent = INDENT_CHAR * '('.length
|
1457
|
+
[
|
1458
|
+
"\n",
|
1459
|
+
indent([
|
1460
|
+
'(',
|
1461
|
+
node.items.map{|x| format(x)}.join(",\n#{item_indent}"),
|
1462
|
+
')'
|
1463
|
+
].join(''))
|
1464
|
+
].join('')
|
1465
|
+
end
|
1460
1466
|
].join('')
|
1461
1467
|
end
|
1462
1468
|
].join('')
|