ro_support 0.0.4
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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +21 -0
- data/lib/ro_support/array.rb +32 -0
- data/lib/ro_support/bash.rb +27 -0
- data/lib/ro_support/debug.rb +80 -0
- data/lib/ro_support/file_actions.rb +40 -0
- data/lib/ro_support/git.rb +64 -0
- data/lib/ro_support/log.rb +15 -0
- data/lib/ro_support/misc/zw.rb +46 -0
- data/lib/ro_support/misc.rb +51 -0
- data/lib/ro_support/module.rb +10 -0
- data/lib/ro_support/spec.rb +46 -0
- data/lib/ro_support/ssh.rb +4 -0
- data/lib/ro_support/string_handler/common.rb +40 -0
- data/lib/ro_support/string_handler.rb +13 -0
- data/lib/ro_support/thor.rb +10 -0
- data/lib/ro_support/version.rb +3 -0
- data/lib/ro_support.rb +23 -0
- data/lib/tasks/roro_support_tasks.rake +4 -0
- data/spec/fixtures/baidu.html +440 -0
- data/spec/fixtures/for_log/ro.log +2 -0
- data/spec/fixtures/for_misc_file_utils/create_dir_file/try.rb +0 -0
- data/spec/fixtures/sample/try1.rb +3 -0
- data/spec/fixtures/sample/try2.rb +3 -0
- data/spec/fixtures/sample/try3.rb +3 -0
- data/spec/lib/roro_support/array_spec.rb +27 -0
- data/spec/lib/roro_support/bash_spec.rb +4 -0
- data/spec/lib/roro_support/debug_spec.rb +42 -0
- data/spec/lib/roro_support/file_actions_spec.rb +10 -0
- data/spec/lib/roro_support/git_spec.rb +23 -0
- data/spec/lib/roro_support/log/ro.log +23 -0
- data/spec/lib/roro_support/log/roro.log +63 -0
- data/spec/lib/roro_support/log_spec.rb +15 -0
- data/spec/lib/roro_support/misc/zw_spec.rb +55 -0
- data/spec/lib/roro_support/misc_spec.rb +37 -0
- data/spec/lib/roro_support/module_spec.rb +15 -0
- data/spec/lib/roro_support/string_handler_spec.rb +17 -0
- data/spec/lib/roro_support_spec.rb +7 -0
- data/spec/spec_helper.rb +29 -0
- metadata +201 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6ccdfe67cf1f839c8b160b26ecdf42c8a7691c80
|
4
|
+
data.tar.gz: 2a9fa9bf87372a4cea22c55da0d835d13641041d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5907695c8501a6581d4a801b9e465d553865584164caa1bb71fdd4dd89c60d40bfd900154c9ecf60743534f9dbcdfffdeffeb46aadd69d5e054f8a8240e6ac28
|
7
|
+
data.tar.gz: 56f7547893d0ffaa353719a3a08bc9a23191165d7c415f43793e52f531dc121ef00894f7446bd0a2923bd4fc5bd83be59229f124b0edc541de4e1883f00bc382
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2013 YOURNAME
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
begin
|
2
|
+
require 'bundler/setup'
|
3
|
+
rescue LoadError
|
4
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
5
|
+
end
|
6
|
+
|
7
|
+
require 'rdoc/task'
|
8
|
+
|
9
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
+
rdoc.rdoc_dir = 'rdoc'
|
11
|
+
rdoc.title = 'RoroSupport'
|
12
|
+
rdoc.options << '--line-numbers'
|
13
|
+
rdoc.rdoc_files.include('README.rdoc')
|
14
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
15
|
+
end
|
16
|
+
Bundler::GemHelper.install_tasks
|
17
|
+
|
18
|
+
require 'rspec/core/rake_task'
|
19
|
+
RSpec::Core::RakeTask.new
|
20
|
+
|
21
|
+
task default: :spec
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module RoSupport
|
2
|
+
module Array
|
3
|
+
Array.class_eval do
|
4
|
+
str = ""
|
5
|
+
|
6
|
+
def to_args
|
7
|
+
str = ""
|
8
|
+
self.each do |arg|
|
9
|
+
if arg.is_a? String
|
10
|
+
arg = preprocess arg
|
11
|
+
str << "'#{arg}',"
|
12
|
+
else
|
13
|
+
str << "#{arg},"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
str.gsub /\,$/, ''
|
17
|
+
end
|
18
|
+
|
19
|
+
def map_with_regexp(regexp)
|
20
|
+
arr = self.dup
|
21
|
+
arr.each_with_index do |e, idx|
|
22
|
+
arr[idx] = yield(e) if e.to_s[regexp]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
def preprocess(str)
|
28
|
+
str.gsub /\'|\"/, ''
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RoSupport
|
2
|
+
module Bash
|
3
|
+
def bash(command)
|
4
|
+
result = `#{command}`
|
5
|
+
print result
|
6
|
+
result
|
7
|
+
end
|
8
|
+
|
9
|
+
def bashes(commands=[])
|
10
|
+
if !commands.empty?
|
11
|
+
bash(commands.join " && ")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
#def set(aliases)
|
17
|
+
# aliases.each do |short, command|
|
18
|
+
# blk = lambda do |*args|
|
19
|
+
# eval "`#{command} #{args.join ' '}`"
|
20
|
+
# end
|
21
|
+
# desc "#{short} *ARGS", "#{command} *ARGS"
|
22
|
+
# define_method short, blk
|
23
|
+
# end
|
24
|
+
#end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module RoSupport
|
2
|
+
module Debug
|
3
|
+
# ro is my name, ro_raise mean my raise
|
4
|
+
def self.included(base)
|
5
|
+
base.send(:alias_method, :ro_raise, :eval)
|
6
|
+
base.send(:alias_method, :ro_return, :eval)
|
7
|
+
end
|
8
|
+
|
9
|
+
def err(msg='error', opt={output: []})
|
10
|
+
err = [""]
|
11
|
+
err << msg
|
12
|
+
err << "Instance Variables:"
|
13
|
+
instance_variables.each do |ivar|
|
14
|
+
err << " #{ivar.to_s}: #{instance_variable_get(ivar)}"
|
15
|
+
end
|
16
|
+
|
17
|
+
print err.join("\n")
|
18
|
+
|
19
|
+
<<-ERROR
|
20
|
+
err = [""]
|
21
|
+
|
22
|
+
err << ""
|
23
|
+
err << "Output Variables:"
|
24
|
+
err << ""
|
25
|
+
#{opt[:output]}.each do |var|
|
26
|
+
if var.is_a?(String)
|
27
|
+
err << " \#{var}:\#{eval var}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
raise err.join("\n") + "\n\n"
|
32
|
+
ERROR
|
33
|
+
end
|
34
|
+
|
35
|
+
def valid(smth, opt={})
|
36
|
+
if opt[:valid?].nil?
|
37
|
+
if smth.is_a?(Array) or smth.is_a?(Hash)
|
38
|
+
is_valid = !smth.empty?
|
39
|
+
else
|
40
|
+
is_valid = !smth.nil?
|
41
|
+
end
|
42
|
+
|
43
|
+
if is_valid
|
44
|
+
return smth
|
45
|
+
else
|
46
|
+
if opt[:output]
|
47
|
+
err('return nil or empty', output: opt[:output])
|
48
|
+
else
|
49
|
+
err('return nil or empty')
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# eg: ro_raise ro_error
|
56
|
+
#def ro_error(err)
|
57
|
+
# <<-RUBY
|
58
|
+
# lvars = {}
|
59
|
+
# local_variables.each do |local_variable|
|
60
|
+
# lvars[local_variable] = eval(local_variable.to_s)
|
61
|
+
# end
|
62
|
+
#
|
63
|
+
# raise "#{err}", lvars: lvars
|
64
|
+
# RUBY
|
65
|
+
#
|
66
|
+
#end
|
67
|
+
#
|
68
|
+
#def ro_return_valid(smth)
|
69
|
+
# <<-RUBY
|
70
|
+
# lvars = {}
|
71
|
+
# local_variables.each do |local_variable|
|
72
|
+
# lvars[local_variable] = eval(local_variable.to_s)
|
73
|
+
# smth_var_name = local_variable.to_s if eval(\"local_variable.to_s\") == #{smth}
|
74
|
+
# end
|
75
|
+
#
|
76
|
+
# return_valid smth_var_name, lvars: lvars
|
77
|
+
# RUBY
|
78
|
+
#end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
module RoSupport
|
3
|
+
module FileActions
|
4
|
+
def create_dir_file(path)
|
5
|
+
file = File.basename path
|
6
|
+
dir = path.gsub file, ''
|
7
|
+
FileUtils.mkdir_p(dir)
|
8
|
+
File.new(path, 'w+')
|
9
|
+
end
|
10
|
+
|
11
|
+
def get_tree_in(dir)
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
#Attentions: module_name must be like file_name
|
16
|
+
# eg: module Array, array.rb is right
|
17
|
+
# eg: moduel ArrayDSL, array.rb is wrong
|
18
|
+
# The File tree is like this:
|
19
|
+
#a
|
20
|
+
#-b.rb
|
21
|
+
#-c.rb
|
22
|
+
#a.rb
|
23
|
+
|
24
|
+
def self.included(base)
|
25
|
+
base.extend ClassMethods
|
26
|
+
end
|
27
|
+
|
28
|
+
module ClassMethods
|
29
|
+
def autoload_all_files_in(dir)
|
30
|
+
Dir[File.join dir, "**"].each do |file|
|
31
|
+
if file[/\.rb$/]
|
32
|
+
module_name = File.basename(file).gsub(/\.rb/, '').camelize
|
33
|
+
autoload module_name.to_sym, file
|
34
|
+
autoload module_name.upcase, file
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# deprecated
|
2
|
+
#require 'grit'
|
3
|
+
#
|
4
|
+
#module RoSupport
|
5
|
+
# module Git
|
6
|
+
|
7
|
+
|
8
|
+
#def git(bash, repo_path=Dir.pwd)
|
9
|
+
# repo = Grit::Repo.new repo_path
|
10
|
+
# ::Grit::Git.git_timeout = 30
|
11
|
+
# args = handle(bash)
|
12
|
+
# command = args.shift
|
13
|
+
# result = eval(bash_format(command, args))
|
14
|
+
# print result.join if result.respond_to?(:join)
|
15
|
+
#end
|
16
|
+
#
|
17
|
+
#def git_commit_all(msg)
|
18
|
+
# repo = Grit::Repo.new Dir.pwd
|
19
|
+
# repo.commit_all(msg)
|
20
|
+
#end
|
21
|
+
#
|
22
|
+
#private
|
23
|
+
#def bash_format(command, args)
|
24
|
+
# git_str = "repo.git.native '#{command}', {process_info: true}"
|
25
|
+
# if args.respond_to?(:each)
|
26
|
+
# args.each do |arg|
|
27
|
+
# git_str += ", '#{arg}'"
|
28
|
+
# end
|
29
|
+
# else
|
30
|
+
# arg = args
|
31
|
+
# git_str += ", '#{arg}'"
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# git_str
|
35
|
+
#end
|
36
|
+
#
|
37
|
+
#def handle(bash)
|
38
|
+
# start_idx, end_idx = nil
|
39
|
+
# args = bash.split(' ')
|
40
|
+
# args.each_with_index do |e, idx|
|
41
|
+
# if e[/'|"/]
|
42
|
+
# if start_idx.nil?
|
43
|
+
# start_idx = idx
|
44
|
+
# else
|
45
|
+
# end_idx = idx
|
46
|
+
# break
|
47
|
+
# end
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
#
|
51
|
+
# if start_idx && end_idx && start_idx != end_idx
|
52
|
+
# msg = args[start_idx..end_idx]
|
53
|
+
# front = args - msg
|
54
|
+
# msg = msg.join(' ')
|
55
|
+
# args = front + [msg]
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# args
|
59
|
+
#end
|
60
|
+
#
|
61
|
+
#def add_arg(git_str, arg)
|
62
|
+
#end
|
63
|
+
# end
|
64
|
+
#end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'logger'
|
2
|
+
module RoSupport
|
3
|
+
module Log
|
4
|
+
def raise_log(content, log_file='ro.log')
|
5
|
+
raise err=content if content.is_a?(Exception)
|
6
|
+
if defined?(Rails) && defined?(Rails.root)
|
7
|
+
log = Logger.new("#{Rails.root}/log/#{log_file}")
|
8
|
+
log.error(content)
|
9
|
+
else
|
10
|
+
log = Logger.new(File.join Dir.pwd, log_file)
|
11
|
+
log.error(content)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'ruby-pinyin'
|
2
|
+
module RoSupport
|
3
|
+
module Misc
|
4
|
+
module Zw
|
5
|
+
::String.class_eval do
|
6
|
+
def is_fuhao?
|
7
|
+
PinYin.of_string(self).empty?
|
8
|
+
end
|
9
|
+
|
10
|
+
def is_hanzi?
|
11
|
+
!PinYin.of_string(self).empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
# example:
|
15
|
+
# "1.".is_nox # => true
|
16
|
+
# "2逼".is_nox # => false
|
17
|
+
def is_no?(x=/\d/)
|
18
|
+
str = self[Regexp.new "#{x}."]
|
19
|
+
if str && !str.empty?
|
20
|
+
mark = str.split('')[-1]
|
21
|
+
# is english sign
|
22
|
+
mark.is_fuhao? or mark.bytes == 1 ? true : false
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def has_no?(x=/\d/)
|
29
|
+
self.scan(/\d./).each do |no|
|
30
|
+
return true if no.is_no? x
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def split_with_no(x=/\d/)
|
35
|
+
nos= self.scan Regexp.new "^#{x}."
|
36
|
+
nos = nos.map do |no|
|
37
|
+
no if no.is_no?
|
38
|
+
end
|
39
|
+
|
40
|
+
r = eval "Regexp.union /#{nos.compact.join("/,/")}/"
|
41
|
+
self.split Regexp.new "(?=^#{r})"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
dirname =__FILE__.gsub /\.rb/, ''
|
3
|
+
|
4
|
+
Dir[File.join dirname, "**"].each do |file|
|
5
|
+
require file
|
6
|
+
end
|
7
|
+
|
8
|
+
module RoSupport
|
9
|
+
module Misc
|
10
|
+
#def set_instance_variable_from(klass, hash = {})
|
11
|
+
# hash.each do |var_name, value|
|
12
|
+
# var_sym = "@#{var_name}".to_sym
|
13
|
+
# klass.instance_variable_set(var_sym, value)
|
14
|
+
# end
|
15
|
+
#end
|
16
|
+
end
|
17
|
+
|
18
|
+
#module Require
|
19
|
+
# attr_accessor :files
|
20
|
+
# list all files in dir
|
21
|
+
|
22
|
+
#def that(dir)
|
23
|
+
# dir_load dir
|
24
|
+
# self
|
25
|
+
#end
|
26
|
+
|
27
|
+
#def self.all_files_in(dir_path)
|
28
|
+
# dirname = dir_path.split('/').last.gsub(/\.rb/, '')
|
29
|
+
# Dir[File.expand_path("../#{dirname}/**", dir_path)].each do |file|
|
30
|
+
# require file
|
31
|
+
# end
|
32
|
+
#end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
#def dir_load (dir_name)
|
37
|
+
# $LOAD_PATH << dir_name
|
38
|
+
# Dir["#{dir_name}/**"].each do |file|
|
39
|
+
# if Dir["#{file}/**"].length >= 1
|
40
|
+
# dirname = file
|
41
|
+
# $LOAD_PATH << dirname
|
42
|
+
# dir_load dirname
|
43
|
+
# else
|
44
|
+
# filename = File.basename(file).gsub /\..+/, ''
|
45
|
+
# @files[filename.to_sym] = file
|
46
|
+
# end
|
47
|
+
# end
|
48
|
+
#end
|
49
|
+
#end
|
50
|
+
#end
|
51
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
require 'active_support'
|
3
|
+
require File.expand_path('../watir', __FILE__)
|
4
|
+
|
5
|
+
module RoSupoort
|
6
|
+
module RSpec
|
7
|
+
include Watir
|
8
|
+
extend ::RSpec::Matchers::DSL
|
9
|
+
|
10
|
+
matcher :have_css do |e|
|
11
|
+
match do |a|
|
12
|
+
a.css(e)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
matcher :exist_not_nil do |*es|
|
17
|
+
match do |a|
|
18
|
+
if es.is_a?(Array)
|
19
|
+
|
20
|
+
es.each do |e|
|
21
|
+
e = ("@" + e.to_s).to_sym
|
22
|
+
a.instance_variable_get(e)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
matcher :be_blank do |e|
|
29
|
+
match do |a|
|
30
|
+
a.blank?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
matcher :be_diff do |e|
|
35
|
+
match do |a|
|
36
|
+
a != e
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
matcher :be_empty do |e|
|
41
|
+
match do |a|
|
42
|
+
a.empty?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module RoSupport
|
2
|
+
module StringHandler
|
3
|
+
module Common
|
4
|
+
def blank?
|
5
|
+
result = self.gsub /\s/, ''
|
6
|
+
result.empty?
|
7
|
+
end
|
8
|
+
|
9
|
+
def uncamelize
|
10
|
+
self.split(/(?=[A-Z])/).join("_").downcase
|
11
|
+
end
|
12
|
+
|
13
|
+
def collect(str, sign, filter = nil, &blk)
|
14
|
+
new_str_arr = collect_sign(str, sign, filter, &blk)
|
15
|
+
|
16
|
+
new_str = new_str_arr.join
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
def collect_sign(str, sign, filter = nil, &blk)
|
21
|
+
raise 'sign must be a regexp' if !sign.is_a?(Regexp)
|
22
|
+
sign = Regexp.new "(?=#{sign.source})"
|
23
|
+
filter ||= sign
|
24
|
+
new_str_arr = []
|
25
|
+
|
26
|
+
str.split(sign).each do |line|
|
27
|
+
if line[filter]
|
28
|
+
if block_given?
|
29
|
+
line = yield(line)
|
30
|
+
end
|
31
|
+
|
32
|
+
new_str_arr << line if line
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
new_str_arr
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/ro_support.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'active_support/core_ext/string'
|
2
|
+
require 'thor'
|
3
|
+
require 'nokogiri'
|
4
|
+
|
5
|
+
$LOAD_PATH.unshift File.expand_path("../..", __FILE__)
|
6
|
+
# autoload
|
7
|
+
|
8
|
+
module RoSupport
|
9
|
+
|
10
|
+
#def self.autoload_modules(*mods)
|
11
|
+
# mods.each do |mod|
|
12
|
+
# autoload mod, mod.to_s.downcase
|
13
|
+
# end
|
14
|
+
#end
|
15
|
+
|
16
|
+
autoload :FileActions, 'lib/ro_support/file_actions'
|
17
|
+
|
18
|
+
include FileActions
|
19
|
+
autoload_all_files_in File.expand_path('../ro_support', __FILE__)
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
|