cocoapods-aomi-bin 0.1.3 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 761d8708d5a6a58529721f57a03176cc6b304a299d73786da206eb2a891b55d6
4
- data.tar.gz: b74e89002309aa292a591e0a37af7cc2f02bb0064ee517d12cd86cfc03e17936
3
+ metadata.gz: 8d60564dc2567c05414925657a0bfcc79c03e29346af7799a236e824a48b522b
4
+ data.tar.gz: c58a951a5261bd33adff5d05e133385a3cc225059b103769a0fb8af333072917
5
5
  SHA512:
6
- metadata.gz: 9a7eddbb8207315d61bda960964b0c051903f8d54c851959383a073a32786b2738a1b0eaf3e2c52ccf56db59fb6869f118b77ea4296ad0b71529f69966f8036f
7
- data.tar.gz: d7e57971be1d7f009f5699c43ebd72a9191949cc30c051e3776592d72f5ec831bc0cb568933c4991bb746832079b36db1dcb15ad3f5212b3ab617d0e316136dc
6
+ metadata.gz: a21bb3fff848840bf1a72671bfc09fadec1dbf67c2103a1958a897065f6fd3d2f69332715bc0afe2e64ed4fc39f2ae3490a3a5b8c3e9eb4df155bf718b522c85
7
+ data.tar.gz: 352d771b8a7731af97c00ac7f83753178f2a8d7bbab02d188d1e4f45f31246f8cb523e2b6d26167034a6766eae96a2ce83b8b95675d37a443cf8c7304898dd48
@@ -6,9 +6,10 @@ require 'cocoapods-lhj-bin/command/bin/code'
6
6
  require 'cocoapods-lhj-bin/command/bin/update'
7
7
  require 'cocoapods-lhj-bin/command/bin/install'
8
8
  require 'cocoapods-lhj-bin/command/bin/import'
9
- require 'cocoapods-lhj-bin/command/bin/local'
9
+ require 'cocoapods-lhj-bin/command/bin/local/local'
10
+ require 'cocoapods-lhj-bin/command/bin/local/fetch'
11
+ require 'cocoapods-lhj-bin/command/bin/local/upload'
10
12
  require 'cocoapods-lhj-bin/command/bin/trans'
11
- require 'cocoapods-lhj-bin/command/bin/fetch'
12
13
  require 'cocoapods-lhj-bin/command/bin/lhj'
13
14
  require 'cocoapods-lhj-bin/command/bin/config/push'
14
15
  require 'cocoapods-lhj-bin/command/bin/oss/list'
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+
5
+ module Pod
6
+ class Command
7
+ class Bin < Command
8
+ class Fetch < Bin
9
+ self.summary = '提取源码的中文字符串,并生成中英文对照csv文件'
10
+
11
+ def self.options
12
+ [
13
+ %w[--file-type 从文件扩展名中查找中文字符串,默认为m,h],
14
+ %w[--file-name 生成csv文件名,默认为gen_cn_key.csv]
15
+ ]
16
+ end
17
+
18
+ def initialize(argv)
19
+ @current_path = argv.shift_argument || Dir.pwd
20
+ @file_type = argv.option('file-type', 'm,h')
21
+ @file_name = argv.option('file-name', 'gen_cn_key.csv')
22
+ @cn_keys = []
23
+ @key_map = {}
24
+ super
25
+ end
26
+
27
+ def run
28
+ handle_files
29
+ gen_csv
30
+ # update_source_header
31
+ end
32
+
33
+ def csv_file_name
34
+ file_name = @file_name
35
+ file_name = "#{@file_name}.csv" unless /.csv$/ =~ @file_name
36
+ file_name
37
+ end
38
+
39
+ def gen_csv
40
+ file = File.join(@current_path, csv_file_name)
41
+ FileUtils.rm_rf(file) if File.exist?(file)
42
+ CSV.open(file, 'wb:utf-8') do |csv|
43
+ csv << %w[国际化key 中文 英文 所在文件 文件路径]
44
+ @cn_keys.each do |k|
45
+ csv << [k[:key], k[:cn], k[:en], k[:fname], k[:dirname]]
46
+ end
47
+ end
48
+ UI.puts "生成csv文件完成.\n文件路径:#{File.absolute_path(file)}".green
49
+ end
50
+
51
+ def handle_files
52
+ Dir.glob("#{@current_path}/**/*.{#{@file_type}}").each do |f|
53
+ handle_file f
54
+ end
55
+ end
56
+
57
+ def zh_ch_reg
58
+ /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
59
+ end
60
+
61
+ def handle_file(file)
62
+ File.open(file, 'r') do |f|
63
+ f.each_line do |line|
64
+ handle_line(file, line) if zh_ch_reg =~ line
65
+ end
66
+ end
67
+ end
68
+
69
+ def handle_line(file, line)
70
+ line.scan(zh_ch_reg) do |str|
71
+ fname = File.basename(file)
72
+ dir_name = File.dirname(file)
73
+ mod_name = framework_name(dir_name)
74
+ key = "#{mod_name}.#{File.basename(file, '.*')}.#{rand(36**8).to_s(36)}"
75
+ cn_str = str[2, str.length - 3]
76
+ en_str = cn_str.gsub(/[\u4e00-\u9fa5]/, 'x')
77
+ @cn_keys << { key: key, cn: cn_str, en: en_str, fname: fname, dirname: dir_name }
78
+ end
79
+ end
80
+
81
+ def framework_name(path)
82
+ mod_name = 'Main'
83
+ if /pods/i =~ path
84
+ ary = path.split('/')
85
+ index = ary.find_index { |p| p.eql?('Pods') }
86
+ if index
87
+ i = index + 1
88
+ mod_name = ary[i]
89
+ end
90
+ end
91
+ mod_name
92
+ end
93
+
94
+ def handle_static_line(file, line)
95
+ line.scan(zh_ch_reg) do |str|
96
+ ma = line.match(/\*.*=/)
97
+ key = ma[0][1, ma[0].length - 2].strip
98
+ @key_map[key.to_sym] = str
99
+ end
100
+ end
101
+
102
+ def update_source_header
103
+ Dir.glob("#{@current_path}/**/*.{m,h}").each do |f|
104
+ if f =~ /Pods/
105
+ handler_file(f) if f =~ %r{Pods/MLF} || f =~ %r{Pods/MLU} || f =~ %r{Pods/MLN}
106
+ else
107
+ handler_file(f)
108
+ end
109
+ end
110
+ end
111
+
112
+ def handler_file(file)
113
+ puts "#{File.absolute_path(file)} \n"
114
+ File.chmod(0o644, file)
115
+ str = file_string(file)
116
+ File.open(file, 'w+') do |f|
117
+ f.write(str)
118
+ end
119
+ File.chmod(0o444, file) if file =~ /Pods/
120
+ end
121
+
122
+ def file_string(file)
123
+ str = ''
124
+ File.open(file, 'r+') do |f|
125
+ f.each_line do |line|
126
+ str += format_string(f, line)
127
+ end
128
+ end
129
+ str
130
+ end
131
+
132
+ def format_string(file, line)
133
+ result = line
134
+ unless /static/ =~ line
135
+ @key_map.each_key do |key|
136
+ n_key = /#{key.to_s}\s/
137
+ n_val = "#{@key_map[key]}\s"
138
+ result = result.gsub(n_key, n_val)
139
+ end
140
+ end
141
+ result
142
+ end
143
+
144
+ end
145
+ end
146
+ end
147
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require 'csv'
4
4
  require 'cocoapods-lhj-bin/helpers/trans_helper'
5
+ require 'cocoapods-lhj-bin/helpers/oss_helper'
5
6
 
6
7
  module Pod
7
8
  class Command
@@ -14,11 +15,12 @@ module Pod
14
15
  %w[--key-col 国际化key在csv中第几列,默认为0],
15
16
  %w[--cn-col 中文在csv中第几列,默认为1],
16
17
  %w[--en-col 英文在csv中第几列,默认为2],
17
- %w[--csv-file csv文件名,默认为当前目录下所有csv文件],
18
- %w[--gen-file 生成配置文件名,默认名为: Localizable.strings],
18
+ %w[--download-csv 云端下载cvs的文件名],
19
+ %w[--read-csv-file 读取csv的文件名,默认为当前目录下所有csv文件],
20
+ %w[--gen-file 生成配置文件名,默认名为:Localizable.strings],
19
21
  %w[--modify-source 修改源码,使用国际化key代替中文字符串],
20
22
  %w[--modify-file-type 需要修改源码的文件类型,默认为m,h],
21
- %w[--modify-format-string 修改为国际化后的字符格式,默认为NSLocalizedString(%s, @"")]
23
+ %w[--modify-format-string 修改为国际化后的字符格式,默认为NSLocalizedString(%s,@"")]
22
24
  ]
23
25
  end
24
26
 
@@ -27,7 +29,8 @@ module Pod
27
29
  @key_col = argv.option('key-col', 0).to_i
28
30
  @cn_col = argv.option('cn-col', 1).to_i
29
31
  @en_col = argv.option('en-col', 2).to_i
30
- @csv_file = argv.option('csv-file', '*')
32
+ @download_csv_files = argv.option('download-csv')
33
+ @read_csv_file = argv.option('read-csv-file', '*')
31
34
  @gen_file_name = argv.option('gen-file', 'Localizable.strings')
32
35
  @modify_source_flag = argv.flag?('modify-source', false)
33
36
  @modify_file_type = argv.option('modify-file-type', 'm,h')
@@ -37,46 +40,109 @@ module Pod
37
40
  end
38
41
 
39
42
  def run
43
+ down_load_csv_file if @download_csv_files
40
44
  read_csv_file
41
45
  if @key_map.keys.length.positive?
42
- # write_en_strings
43
- # write_zh_cn_strings
44
- # write_zh_hk_strings
46
+ write_en_strings
47
+ write_zh_cn_strings
48
+ write_zh_hk_strings
45
49
  handle_modify_source if @modify_source_flag
46
50
  else
47
- UI.puts "获取中英文映射文件失败, 检查参数--csv-file=xx是否正常\n".red
51
+ UI.puts "获取中英文映射文件失败, 检查参数--read-csv-file=xx是否正常\n".red
48
52
  end
49
53
  end
50
54
 
51
55
  def en_dir_name
52
- 'en.lproj'
56
+ 'local_gen/en.lproj'
53
57
  end
54
58
 
55
59
  def zh_hk_dir_name
56
- 'zh-hk.lproj'
60
+ 'local_gen/zh-hk.lproj'
57
61
  end
58
62
 
59
63
  def zh_cn_dir_name
60
- 'zh-cn.lproj'
64
+ 'local_gen/zh-cn.lproj'
61
65
  end
62
66
 
63
67
  def generate_file_name
64
68
  @gen_file_name
65
69
  end
66
70
 
71
+ def read_csv_file_name
72
+ file_name = @read_csv_file
73
+ file_name = "#{@read_csv_file}.csv" unless /.csv$/ =~ @read_csv_file
74
+ file_name
75
+ end
76
+
77
+ def down_load_csv_file
78
+ ary = get_download_keys
79
+ ary.each do |key|
80
+ file_name = File.basename(key)
81
+ file = File.join(@current_path, file_name)
82
+ backup_csv_file file if File.exist?(file)
83
+ UI.puts "下载csv文件:#{CBin::OSS::Helper.instance.object_url(key)} 到目录#{file}\n".green
84
+ CBin::OSS::Helper.instance.down_load(key, file)
85
+ end
86
+ UI.puts "下载云端csv文件完成 \n".green
87
+ end
88
+
89
+ def backup_csv_file(file)
90
+ dest_file = bak_file(file)
91
+ FileUtils.mkdir_p(File.dirname(dest_file)) unless File.exist?(File.dirname(dest_file))
92
+ UI.puts "备份csv文件:#{file} 到目录#{dest_file}".green
93
+ FileUtils.cp file, dest_file
94
+ FileUtils.rm_rf file
95
+ end
96
+
97
+ def bak_file(file)
98
+ dest_file = File.join(File.dirname(file), 'csv_bak', File.basename(file))
99
+ File.exist?(dest_file) ? bak_file(dest_file) : dest_file
100
+ end
101
+
102
+ def get_download_keys
103
+ download_keys = []
104
+ csv_files = @download_csv_files.split(/,/).map(&:strip)
105
+ all_keys = CBin::OSS::Helper.instance.list.map(&:key)
106
+ csv_files.each do |f|
107
+ arr = all_keys.select { |k| %r{^csv/} =~ k && /#{f}/ =~ k }
108
+ if arr.count.positive?
109
+ arr.sort! { |a, b| b.split(%r{/})[1].to_i <=> a.split(%r{/})[1].to_i }
110
+ download_keys << arr[0]
111
+ end
112
+ end
113
+ download_keys
114
+ end
115
+
116
+ def read_csv_file
117
+ path = File.join(@current_path, read_csv_file_name)
118
+ Dir.glob(path).each do |p|
119
+ CSV.foreach(p) do |row|
120
+ key = row[@key_col]
121
+ @key_map[key] = { key: key, zh: row[@cn_col], en: row[@en_col] } unless key =~ /[\u4e00-\u9fa5]/
122
+ end
123
+ end
124
+ end
125
+
67
126
  def handle_modify_source
68
- UI.puts '开始修改源码开始'
127
+ UI.puts '修改源码开始'
69
128
  Dir.glob("#{@current_path}/**/*.{#{@modify_file_type}}").each do |f|
70
- handle_modify_file f if File.stat(f).writable?
129
+ # handle_modify_file f if File.stat(f).writable?
130
+ if f =~ /Pods/
131
+ handle_modify_file(f) if f =~ %r{Pods/ML}
132
+ else
133
+ handle_modify_file(f)
134
+ end
71
135
  end
72
- UI.puts '开始修改源码结束'
136
+ UI.puts '修改源码结束'
73
137
  end
74
138
 
75
139
  def handle_modify_file(file)
140
+ File.chmod(0o644, file)
76
141
  str = modify_file_string(file)
77
142
  File.open(file, 'w+') do |f|
78
143
  f.write(str)
79
144
  end
145
+ File.chmod(0o444, file) if file =~ /Pods/
80
146
  end
81
147
 
82
148
  def modify_file_string(file)
@@ -89,42 +155,36 @@ module Pod
89
155
  str
90
156
  end
91
157
 
158
+ def zh_ch_reg
159
+ /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
160
+ end
161
+
92
162
  def modify_format_string(file, line)
93
163
  result = line
94
- result = handle_modify_line line if line =~ /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
164
+ result = handle_modify_line(file, line) if zh_ch_reg =~ line
95
165
  result
96
166
  end
97
167
 
98
- def handle_modify_line(line)
168
+ def handle_modify_line(file, line)
99
169
  result = line
100
- reg = /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
101
- ma = reg.match(line)
102
- key = find_key_by_cn_val(ma[0])
103
- if key
104
- val = format(@modify_format_string, "@\"#{key}\"")
105
- result = line.gsub(ma[0], val)
170
+ line.scan(zh_ch_reg) do |m|
171
+ key = find_key_by_cn_val(file, m)
172
+ if key
173
+ val = format(@modify_format_string, "@\"#{key}\"")
174
+ result = result.gsub(m, val)
175
+ end
106
176
  end
107
177
  result
108
178
  end
109
179
 
110
- def find_key_by_cn_val(val)
180
+ def find_key_by_cn_val(file, val)
181
+ file_name = File.basename(file, '.*')
111
182
  cn_key = val[2, val.length - 3]
112
- index = @key_map.values.find_index do |obj|
113
- /^#{cn_key}$/ =~ obj[:zh]
114
- end
183
+ index = @key_map.values.find_index { |obj| cn_key.eql?(obj[:zh]) && /#{file_name}/ =~ obj[:key] }
184
+ index ||= @key_map.values.find_index { |obj| cn_key.eql?(obj[:zh]) }
115
185
  @key_map.values[index][:key] if index
116
186
  end
117
187
 
118
- def read_csv_file
119
- path = "#{@current_path}/#{@csv_file}.csv"
120
- Dir.glob(path).each do |p|
121
- CSV.foreach(p) do |row|
122
- key = row[@key_col]
123
- @key_map[key] = { key: key, zh: row[@cn_col], en: row[@en_col] } unless key =~ /[\u4e00-\u9fa5]/
124
- end
125
- end
126
- end
127
-
128
188
  def format_str(type, area = :cn)
129
189
  str = ''
130
190
  @key_map.each do |k, v|
@@ -0,0 +1,46 @@
1
+ require 'cocoapods-lhj-bin/helpers/oss_helper'
2
+
3
+ module Pod
4
+ class Command
5
+ class Bin < Command
6
+ class Local < Bin
7
+ class Upload < Local
8
+ self.summary = '上传中英文对照csv文件'
9
+
10
+ def self.options
11
+ [
12
+ %w[--upload-file 上传中英文对照csv文件名]
13
+ ]
14
+ end
15
+
16
+ def initialize(argv)
17
+ @pwd_path = argv.shift_argument || Dir.pwd
18
+ @upload_csv_file = argv.option('upload-file', '*.csv')
19
+ super
20
+ end
21
+
22
+ def csv_file_name
23
+ file_name = @upload_csv_file
24
+ file_name = "#{@upload_csv_file}.csv" unless /.csv$/ =~ @upload_csv_file
25
+ file_name
26
+ end
27
+
28
+ def csv_oss_key(file_name)
29
+ "csv/#{Time.now.to_i}/#{file_name}"
30
+ end
31
+
32
+ def run
33
+ csv_files = File.join(@pwd_path, '**', csv_file_name)
34
+ Dir.glob(csv_files).each do |f|
35
+ file_name = File.basename(f)
36
+ oss_key = csv_oss_key file_name
37
+ CBin::OSS::Helper.instance.upload(oss_key, f)
38
+ url = CBin::OSS::Helper.instance.object_url(oss_key)
39
+ UI.puts "云端上传成功.下载Url:#{url}\n".green
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -24,7 +24,7 @@ module Pod
24
24
  end
25
25
 
26
26
  def validate!
27
- help! "请输入key" unless @key
27
+ help! '请输入key' unless @key
28
28
  super
29
29
  end
30
30
 
@@ -8,10 +8,6 @@ module Pod
8
8
  class List < OSS
9
9
  self.summary = '查看OSS列表'
10
10
 
11
- def initialize(argv)
12
- super
13
- end
14
-
15
11
  def run
16
12
  objects = CBin::OSS::Helper.instance.list
17
13
  objects.each do |o|
@@ -36,12 +36,9 @@ module CBin
36
36
  case configuration_env
37
37
  when 'release_iphoneos'
38
38
  file = config_release_iphoneos_file
39
- puts "\n====== #{configuration_env} 环境 ========"
40
39
  when 'debug_iphoneos'
41
40
  file = config_debug_iphoneos_file
42
- puts "\n====== #{configuration_env} 环境 ========"
43
41
  when 'dev'
44
- puts "\n====== #{configuration_env} 环境 ========"
45
42
  else
46
43
  raise "\n===== #{configuration_env} 参数有误,请检查%w[dev debug_iphoneos release_iphoneos]===="
47
44
  end
@@ -1,5 +1,5 @@
1
1
  module CBin
2
- VERSION = '0.1.3'
2
+ VERSION = '0.1.8'
3
3
  end
4
4
 
5
5
  module Pod
@@ -19,6 +19,14 @@ module CBin
19
19
  @bucket.put_object(key, :file => file)
20
20
  end
21
21
 
22
+ def down_load(key, file)
23
+ @bucket.get_object(key, :file => file)
24
+ end
25
+
26
+ def object_url(key)
27
+ @bucket.object_url(key, false)
28
+ end
29
+
22
30
  def list
23
31
  @bucket.list_objects
24
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cocoapods-aomi-bin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - lihaijian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-14 00:00:00.000000000 Z
11
+ date: 2021-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: cocoapods
@@ -111,14 +111,15 @@ files:
111
111
  - lib/cocoapods-lhj-bin/command/bin/code.rb
112
112
  - lib/cocoapods-lhj-bin/command/bin/config/push.rb
113
113
  - lib/cocoapods-lhj-bin/command/bin/dup.rb
114
- - lib/cocoapods-lhj-bin/command/bin/fetch.rb
115
114
  - lib/cocoapods-lhj-bin/command/bin/import.rb
116
115
  - lib/cocoapods-lhj-bin/command/bin/init.rb
117
116
  - lib/cocoapods-lhj-bin/command/bin/initHotKey.rb
118
117
  - lib/cocoapods-lhj-bin/command/bin/install.rb
119
118
  - lib/cocoapods-lhj-bin/command/bin/lhj.rb
120
119
  - lib/cocoapods-lhj-bin/command/bin/lib/lint.rb
121
- - lib/cocoapods-lhj-bin/command/bin/local.rb
120
+ - lib/cocoapods-lhj-bin/command/bin/local/fetch.rb
121
+ - lib/cocoapods-lhj-bin/command/bin/local/local.rb
122
+ - lib/cocoapods-lhj-bin/command/bin/local/upload.rb
122
123
  - lib/cocoapods-lhj-bin/command/bin/oss/del.rb
123
124
  - lib/cocoapods-lhj-bin/command/bin/oss/list.rb
124
125
  - lib/cocoapods-lhj-bin/command/bin/repo/update.rb
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'csv'
4
-
5
- module Pod
6
- class Command
7
- class Bin < Command
8
- class Fetch < Bin
9
- self.summary = '提取源码的中文字符串,并生成中英文对照csv文件'
10
-
11
- def self.options
12
- [
13
- %w[--file-type 从文件扩展名中查找中文字符串,默认为m,h],
14
- %w[--file-name 生成csv文件名,默认为gen_cn_key.csv]
15
- ]
16
- end
17
-
18
- def initialize(argv)
19
- @current_path = argv.shift_argument || Dir.pwd
20
- @file_type = argv.option('file-type', 'm,h')
21
- @file_name = argv.option('file-name', 'gen_cn_key.csv')
22
- @cn_keys = []
23
- super
24
- end
25
-
26
- def run
27
- handle_files
28
- gen_csv
29
- end
30
-
31
- def gen_csv
32
- file = File.join(@current_path, @file_name)
33
- FileUtils.rm_rf(file) if File.exist?(file)
34
- CSV.open(file, 'wb:utf-8') do |csv|
35
- csv << %w[国际化key 中文 英文 原字符 所在文件 文件路径]
36
- @cn_keys.each do |k|
37
- csv << [k[:key], k[:cn], k[:en], k[:str], k[:fname], k[:dirname]]
38
- end
39
- end
40
- UI.puts "生成csv文件完成.\n文件路径:#{File.absolute_path(file)}".green
41
- end
42
-
43
- def handle_files
44
- Dir.glob("#{@current_path}/**/*.{#{@file_type}}").each do |f|
45
- handle_file f
46
- end
47
- end
48
-
49
- def handle_file(file)
50
- File.open(file, 'r') do |f|
51
- f.each_line do |line|
52
- handle_line(file, line) if line =~ /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
53
- end
54
- end
55
- end
56
-
57
- def handle_line(file, line)
58
- reg = /@"[^"]*[\u4e00-\u9fa5]+[^"]*"/
59
- ma = reg.match(line)
60
- str = ma[0]
61
- key = "#{File.basename(file, '.*')}.#{rand(36**8).to_s(36)}"
62
- @cn_keys << { key: key, cn: str[2, str.length - 3], en: '', str: str, dirname: File.dirname(file),
63
- fname: File.basename(file) }
64
- end
65
- end
66
- end
67
- end
68
- end