ronin-wordlists 0.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.github/workflows/ruby.yml +43 -0
  4. data/.gitignore +14 -0
  5. data/.rspec +1 -0
  6. data/.rubocop.yml +18 -0
  7. data/.ruby-version +1 -0
  8. data/.yardopts +1 -0
  9. data/COPYING.txt +165 -0
  10. data/ChangeLog.md +10 -0
  11. data/Gemfile +37 -0
  12. data/README.md +180 -0
  13. data/Rakefile +45 -0
  14. data/bin/ronin-wordlists +34 -0
  15. data/data/completions/ronin-wordlists +107 -0
  16. data/data/completions/ronin-wordlists.yml +7 -0
  17. data/data/wordlists.yml +260 -0
  18. data/gemspec.yml +40 -0
  19. data/lib/ronin/wordlists/cache_dir.rb +257 -0
  20. data/lib/ronin/wordlists/cli/command.rb +40 -0
  21. data/lib/ronin/wordlists/cli/commands/completion.rb +61 -0
  22. data/lib/ronin/wordlists/cli/commands/download.rb +109 -0
  23. data/lib/ronin/wordlists/cli/commands/list.rb +79 -0
  24. data/lib/ronin/wordlists/cli/commands/purge.rb +60 -0
  25. data/lib/ronin/wordlists/cli/commands/remove.rb +74 -0
  26. data/lib/ronin/wordlists/cli/commands/search.rb +145 -0
  27. data/lib/ronin/wordlists/cli/commands/update.rb +98 -0
  28. data/lib/ronin/wordlists/cli/wordlist_dir_option.rb +64 -0
  29. data/lib/ronin/wordlists/cli/wordlist_index.rb +178 -0
  30. data/lib/ronin/wordlists/cli/wordlist_option.rb +66 -0
  31. data/lib/ronin/wordlists/cli.rb +56 -0
  32. data/lib/ronin/wordlists/exceptions.rb +47 -0
  33. data/lib/ronin/wordlists/mixin.rb +106 -0
  34. data/lib/ronin/wordlists/root.rb +28 -0
  35. data/lib/ronin/wordlists/search_paths.rb +153 -0
  36. data/lib/ronin/wordlists/version.rb +26 -0
  37. data/lib/ronin/wordlists/wordlist_dir.rb +194 -0
  38. data/lib/ronin/wordlists/wordlist_file.rb +141 -0
  39. data/lib/ronin/wordlists/wordlist_metadata.rb +43 -0
  40. data/lib/ronin/wordlists/wordlist_repo.rb +167 -0
  41. data/lib/ronin/wordlists.rb +96 -0
  42. data/man/ronin-wordlists-completion.1 +76 -0
  43. data/man/ronin-wordlists-completion.1.md +78 -0
  44. data/man/ronin-wordlists-download.1 +47 -0
  45. data/man/ronin-wordlists-download.1.md +48 -0
  46. data/man/ronin-wordlists-list.1 +42 -0
  47. data/man/ronin-wordlists-list.1.md +44 -0
  48. data/man/ronin-wordlists-purge.1 +39 -0
  49. data/man/ronin-wordlists-purge.1.md +39 -0
  50. data/man/ronin-wordlists-remove.1 +43 -0
  51. data/man/ronin-wordlists-remove.1.md +44 -0
  52. data/man/ronin-wordlists-search.1 +37 -0
  53. data/man/ronin-wordlists-search.1.md +37 -0
  54. data/man/ronin-wordlists-update.1 +43 -0
  55. data/man/ronin-wordlists-update.1.md +44 -0
  56. data/man/ronin-wordlists.1 +65 -0
  57. data/man/ronin-wordlists.1.md +64 -0
  58. data/ronin-wordlists.gemspec +62 -0
  59. data/scripts/setup +58 -0
  60. metadata +154 -0
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cli/wordlist_dir_option'
23
+ require 'ronin/wordlists/cli/wordlist_index'
24
+
25
+ require 'ronin/core/cli/logging'
26
+
27
+ module Ronin
28
+ module Wordlists
29
+ class CLI
30
+ module Commands
31
+ #
32
+ # Downloads a wordlist.
33
+ #
34
+ # ## Usage
35
+ #
36
+ # ronin-wordlists download [options] {NAME | URL}
37
+ #
38
+ # ## Options
39
+ #
40
+ # -d, --wordlist-dir DIR The wordlist directory
41
+ # -h, --help Print help information
42
+ #
43
+ # ## Arguments
44
+ #
45
+ # NAME | URL The wordlist name or URL to download
46
+ #
47
+ class Download < Command
48
+
49
+ include WordlistDirOption
50
+ include Core::CLI::Logging
51
+
52
+ usage '[options] {NAME | URL}'
53
+
54
+ argument :name_or_url, required: true,
55
+ usage: 'NAME | URL',
56
+ desc: 'The wordlist name or URL to download'
57
+
58
+ description 'Downloads a wordlist'
59
+
60
+ man_page 'ronin-wordlists-download.1'
61
+
62
+ #
63
+ # Runs the `ronin-wordlists download` command.
64
+ #
65
+ # @param [String] name_or_url
66
+ # The wordlist name or URL to download.
67
+ #
68
+ def run(name_or_url)
69
+ if name_or_url =~ %r{\A(?:git|http|https)://}
70
+ url = name_or_url
71
+
72
+ download(url)
73
+ else
74
+ index = WordlistIndex.load
75
+ name = name_or_url
76
+
77
+ if (entry = index[name])
78
+ download(entry.url)
79
+ else
80
+ print_error "unknown wordlist: #{name}"
81
+ exit(1)
82
+ end
83
+ end
84
+ end
85
+
86
+ #
87
+ # Downloads a wordlist from the URL.
88
+ #
89
+ # @param [String] url
90
+ # The URL to download from.
91
+ #
92
+ def download(url)
93
+ log_info "Downloading wordlist #{url} ..."
94
+
95
+ begin
96
+ downloaded_wordlist = wordlist_dir.download(url)
97
+
98
+ log_info "Wordlist #{downloaded_wordlist.name} downloaded"
99
+ rescue DownloadFailed => error
100
+ log_error error.message
101
+ exit(2)
102
+ end
103
+ end
104
+
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cli/wordlist_dir_option'
23
+ require 'ronin/wordlists'
24
+
25
+ module Ronin
26
+ module Wordlists
27
+ class CLI
28
+ module Commands
29
+ #
30
+ # Lists installed wordlists on the system.
31
+ #
32
+ # ## Usage
33
+ #
34
+ # ronin-wordlists list [options] [NAME]
35
+ #
36
+ # ## Options
37
+ #
38
+ # -d, --wordlist-dir DIR The wordlist directory
39
+ # -h, --help Print help information
40
+ #
41
+ # ## Arguments
42
+ #
43
+ # [NAME] Optional wordlist name to search for
44
+ #
45
+ class List < Command
46
+
47
+ include WordlistDirOption
48
+
49
+ usage '[options] [NAME]'
50
+
51
+ argument :name, required: false,
52
+ usage: 'NAME',
53
+ desc: 'Optional wordlist name to search for'
54
+
55
+ description 'Lists installed wordlists on the system'
56
+
57
+ man_page 'ronin-wordlists-list.1'
58
+
59
+ #
60
+ # Runs the `ronin-wordlists list` command.
61
+ #
62
+ # @param [String, nil] name
63
+ # The optional wordlist name.
64
+ #
65
+ def run(name=nil)
66
+ wordlists = if name then wordlist_dir.list(name)
67
+ else wordlist_dir.list
68
+ end
69
+
70
+ wordlists.each do |wordlist|
71
+ puts " #{wordlist}"
72
+ end
73
+ end
74
+
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cli/wordlist_dir_option'
23
+
24
+ module Ronin
25
+ module Wordlists
26
+ class CLI
27
+ module Commands
28
+ #
29
+ # Purges all cached wordlists.
30
+ #
31
+ # ## Usage
32
+ #
33
+ # ronin-wordlists purge [options]
34
+ #
35
+ # ## Options
36
+ #
37
+ # -d, --wordlist-dir DIR The wordlist directory
38
+ # -h, --help Print help information
39
+ #
40
+ class Purge < Command
41
+
42
+ include WordlistDirOption
43
+
44
+ description 'Purges all downloaded wordlists'
45
+
46
+ man_page 'ronin-wordlists-purge.1'
47
+
48
+ #
49
+ # Runs the `ronin-wordlists purge` command.
50
+ #
51
+ def run
52
+ cache_dir = CacheDir.new
53
+ cache_dir.purge
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cli/wordlist_dir_option'
23
+
24
+ require 'ronin/core/cli/logging'
25
+
26
+ module Ronin
27
+ module Wordlists
28
+ class CLI
29
+ module Commands
30
+ #
31
+ # Removes a wordlist from the cache directory.
32
+ #
33
+ # ## Usage
34
+ #
35
+ # ronin-wordlists remove [options] NAME
36
+ #
37
+ # ## Options
38
+ #
39
+ # -d, --wordlist-dir DIR The wordlist directory
40
+ # -h, --help Print help information
41
+ #
42
+ # ## Arguments
43
+ #
44
+ # NAME The wordlist to remove
45
+ #
46
+ class Remove < Command
47
+
48
+ include WordlistDirOption
49
+ include Core::CLI::Logging
50
+
51
+ usage '[options] NAME'
52
+
53
+ argument :name, required: true,
54
+ desc: 'The wordlist to remove'
55
+
56
+ description 'Deletes a wordlist from the cache directory'
57
+
58
+ man_page 'ronin-wordlists-remove.1'
59
+
60
+ #
61
+ # Runs the `ronin-wordlists remove` command.
62
+ #
63
+ def run(name)
64
+ wordlist_dir.remove(name)
65
+ rescue WordlistNotFound
66
+ print_error "no such wordlist: #{name}"
67
+ exit(1)
68
+ end
69
+
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cli/wordlist_index'
23
+
24
+ require 'set'
25
+
26
+ module Ronin
27
+ module Wordlists
28
+ class CLI
29
+ module Commands
30
+ #
31
+ # Lists wordlists available for download or installation.
32
+ #
33
+ # ## Usage
34
+ #
35
+ # ronin-wordlists search [options]
36
+ #
37
+ # ## Options
38
+ #
39
+ # -c, --category NAME Filters wordlists by a specific category
40
+ # -h, --help Print help information
41
+ #
42
+ # Arguments:
43
+ # [KEYWORD] Optional search keyword
44
+ #
45
+ class Search < Command
46
+
47
+ usage '[options] [KEYWORD]'
48
+
49
+ option :category, short: '-c',
50
+ value: {
51
+ type: String,
52
+ usage: 'NAME'
53
+ },
54
+ desc: 'Filters wordlists by a specific category' do |category|
55
+ @categories << category
56
+ end
57
+
58
+ argument :keyword, required: false,
59
+ desc: 'Optional search keyword'
60
+
61
+ description 'Lists wordlists available for download or installation'
62
+
63
+ man_page 'ronin-wordlists-search.1'
64
+
65
+ # Wordlist categories to filter by.
66
+ #
67
+ # @return [Set<String>]
68
+ attr_reader :categories
69
+
70
+ #
71
+ # Initializes the `ronin-wordlists search` command.
72
+ #
73
+ # @param [Hash{Symbol => Object}] kwargs
74
+ # Additional keyword arguments for the command.
75
+ #
76
+ def initialize(**kwargs)
77
+ super(**kwargs)
78
+
79
+ @categories = Set.new
80
+ end
81
+
82
+ #
83
+ # Runs the `ronin-wordlists search` command.
84
+ #
85
+ # @param [String, nil] keyword
86
+ # The optional search keyword.
87
+ #
88
+ def run(keyword=nil)
89
+ search(keyword, categories: @categories).each do |entry|
90
+ print_entry(entry)
91
+ end
92
+ end
93
+
94
+ #
95
+ # Searches for matching entries in the wordlist index file.
96
+ #
97
+ # @param [String, nil] keyword
98
+ # The optional search keyword.
99
+ #
100
+ # @param [Set<String>, nil] categories
101
+ # The optional set of categories to filter by.
102
+ #
103
+ # @return [Enumerator::Lazy]
104
+ # The filtered wordlist index entries.
105
+ #
106
+ def search(keyword=nil, categories: Set.new)
107
+ entries = WordlistIndex.load.lazy
108
+
109
+ unless categories.empty?
110
+ entries = entries.filter do |entry|
111
+ categories.subset?(entry.categories)
112
+ end
113
+ end
114
+
115
+ if keyword
116
+ entries = entries.filter do |entry|
117
+ entry.name.include?(keyword) ||
118
+ entry.summary.include?(keyword) ||
119
+ entry.categories.include?(keyword)
120
+ end
121
+ end
122
+
123
+ return entries
124
+ end
125
+
126
+ #
127
+ # Prints an entry from the wordlist index file.
128
+ #
129
+ # @param [WordlistIndex::Entry] entry
130
+ # An entry from the wordlist index file.
131
+ #
132
+ def print_entry(entry)
133
+ puts "[ #{entry.name} ]"
134
+ puts
135
+ puts " * URL: #{entry.url}"
136
+ puts " * Categories: #{entry.categories.join(', ')}"
137
+ puts " * Summary: #{entry.summary}"
138
+ puts
139
+ end
140
+
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cli/command'
22
+ require 'ronin/wordlists/cache_dir'
23
+
24
+ require 'ronin/core/cli/logging'
25
+
26
+ module Ronin
27
+ module Wordlists
28
+ class CLI
29
+ module Commands
30
+ #
31
+ # Updates a wordlist or all wordlists.
32
+ #
33
+ # ## Usage
34
+ #
35
+ # ronin-wordlists update [options] [WORDLISt]
36
+ #
37
+ # ## Options
38
+ #
39
+ # -h, --help Print help information
40
+ #
41
+ # ## Arguments
42
+ #
43
+ # [WORDLIST] The optional wordlist to update
44
+ #
45
+ class Update < Command
46
+
47
+ include Core::CLI::Logging
48
+
49
+ usage '[options] [WORDLISt]'
50
+
51
+ argument :wordlist, required: false,
52
+ desc: 'The optional wordlist to update'
53
+
54
+ description 'Updates a wordlist or all wordlists'
55
+
56
+ man_page 'ronin-wordlists-update.1'
57
+
58
+ #
59
+ # Runs the `ronin-wordlists update` command.
60
+ #
61
+ # @param [String, nil] name
62
+ # The optional wordlist name to update.
63
+ #
64
+ def run(name=nil)
65
+ cache_dir = CacheDir.new
66
+
67
+ if name
68
+ begin
69
+ update(cache_dir[name])
70
+ rescue WordlistNotFound
71
+ print_error "no such wordlist: #{name}"
72
+ exit(1)
73
+ end
74
+ else
75
+ cache_dir.each(&method(:update))
76
+ end
77
+ end
78
+
79
+ #
80
+ # Updates a wordlist.
81
+ #
82
+ # @param [WordlistFile, WordlistRepo] wordlist
83
+ # The wordlist file or git repository to update.
84
+ #
85
+ def update(wordlist)
86
+ log_info "Updating wordlist #{wordlist.name} from #{wordlist.url} ..."
87
+ begin
88
+ wordlist.update
89
+ rescue DownloadFailed => error
90
+ log_error error.message
91
+ end
92
+ end
93
+
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ #
3
+ # ronin-wordlists - A library and tool for managing wordlists.
4
+ #
5
+ # Copyright (c) 2023-2024 Hal Brodigan (postmodern.mod3@gmail.com)
6
+ #
7
+ # ronin-wordlists is free software: you can redistribute it and/or modify
8
+ # it under the terms of the GNU Lesser General Public License as published
9
+ # by the Free Software Foundation, either version 3 of the License, or
10
+ # (at your option) any later version.
11
+ #
12
+ # ronin-wordlists is distributed in the hope that it will be useful,
13
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ # GNU Lesser General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU Lesser General Public License
18
+ # along with ronin-wordlists. If not, see <https://www.gnu.org/licenses/>.
19
+ #
20
+
21
+ require 'ronin/wordlists/cache_dir'
22
+ require 'ronin/wordlists/wordlist_dir'
23
+
24
+ module Ronin
25
+ module Wordlists
26
+ class CLI
27
+ #
28
+ # Adds the `--wordlist-dir DIR` option to a command.
29
+ #
30
+ module WordlistDirOption
31
+ #
32
+ # Adds the `--wordlist-dir DIR` option to the command including
33
+ # {WordlistDirOption}.
34
+ #
35
+ # @param [Class<Command>] command
36
+ # The command class including {WordlistDirOption}.
37
+ #
38
+ def self.included(command)
39
+ command.option :wordlist_dir, short: '-d',
40
+ value: {
41
+ type: String,
42
+ usage: 'DIR'
43
+ },
44
+ desc: 'The wordlist directory'
45
+ end
46
+
47
+ #
48
+ # The wordlist directory.
49
+ #
50
+ # @return [CacheDir, WordlistDir]
51
+ # The {WordlistDir} if the `--wordlist-dir` option was specified or
52
+ # {CacheDir}.
53
+ #
54
+ def wordlist_dir
55
+ @wordlist_dir ||= if options[:wordlist_dir]
56
+ WordlistDir.new(options[:wordlist_dir])
57
+ else
58
+ CacheDir.new
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end