ruby-shadow 2.2.0 → 2.3.1
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.
- data/HISTORY +14 -0
- data/LICENSE +5 -0
- data/MANIFEST +5 -2
- data/README +24 -20
- data/extconf.rb +46 -24
- data/{depend → pwd/depend} +0 -0
- data/pwd/shadow.c +125 -0
- data/ruby-shadow.gemspec +2 -2
- data/shadow/depend +9 -0
- data/{shadow.c → shadow/shadow.c} +15 -7
- metadata +18 -11
- checksums.yaml +0 -7
data/HISTORY
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
[2013/11/13]
|
2
|
+
* Version 2.3.1
|
3
|
+
- Caleb Land<caleb.land@gmail.com>
|
4
|
+
Remove sgetspent on implementations using pwd.h
|
5
|
+
[2013/11/13]
|
6
|
+
* Version 2.3.0
|
7
|
+
- Caleb Land<caleb.land@gmail.com>
|
8
|
+
Merge OS X work into main gem. Fix bugs with OS X implementation and tweak support for FreeBSD.
|
9
|
+
See https://github.com/caleb/ruby-shadow/commit/20d98b7d9e3bbbef0b737affd3245590096a316c
|
10
|
+
- Add license file to Manifest.
|
11
|
+
[2013/02/25]
|
12
|
+
- Adam Palmblad<apalmblad@gmail.com>
|
13
|
+
Fix compilation issues with ruby 2.
|
14
|
+
|
1
15
|
[2012/04/17]
|
2
16
|
* Version 2.1.4
|
3
17
|
- MATSUU Takuto <matsuu@gentoo.org>
|
data/LICENSE
ADDED
data/MANIFEST
CHANGED
data/README
CHANGED
@@ -5,16 +5,20 @@ Modified at: <1999/8/19 06:47:14 by ttate>
|
|
5
5
|
License: See LICENSE
|
6
6
|
|
7
7
|
|
8
|
+
|
8
9
|
1. What's this
|
9
10
|
|
10
|
-
This
|
11
|
+
This module provides tools to read, and, on Linux, append, information related to password files.
|
12
|
+
|
13
|
+
Recent versions work on both Linux, Solaris, OS X and FreeBSD.
|
14
|
+
The functions found are translated to their equivalents in libshadow.
|
11
15
|
|
12
|
-
|
16
|
+
Note
|
13
17
|
|
14
18
|
2. install
|
15
19
|
|
16
20
|
ruby extconf.rb
|
17
|
-
make
|
21
|
+
make # use gmake on FreeBSD
|
18
22
|
(make install)
|
19
23
|
|
20
24
|
* Note:
|
@@ -22,20 +26,19 @@ make
|
|
22
26
|
still present, but no promises about earlier versions of Ruby.
|
23
27
|
|
24
28
|
3. Shadow::Passwd module's methods
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
lock
|
36
|
-
|
37
|
-
*
|
38
|
-
systems. In current versions, that method will be completely missing.
|
29
|
+
____________________________________________________________
|
30
|
+
Method | Linux | Solaris | OS X | FreeBSD
|
31
|
+
____________________________________________________________
|
32
|
+
getspent | * | * | * | *
|
33
|
+
getspnam(name) | * | * | * | *
|
34
|
+
setspent | * | * | * | *
|
35
|
+
endspent | * | * | * | *
|
36
|
+
fgetspent(file) | * | * | N | N
|
37
|
+
sgetspent(str) | * | N | N | N
|
38
|
+
putspent(entry,file) | * | * | N | N
|
39
|
+
lckpwdf,lock | * | * | N | N
|
40
|
+
ulckpwdf,unlock | * | * | N | N
|
41
|
+
lock? | * | * | N | N
|
39
42
|
|
40
43
|
|
41
44
|
4. Structure
|
@@ -43,15 +46,16 @@ lock?
|
|
43
46
|
Shadow::Passwd::Entry (Struct::PasswdEntry)
|
44
47
|
sp_namp - pointer to null-terminated user name.
|
45
48
|
sp_pwdp - pointer to null-terminated password.
|
46
|
-
sp_lstchg
|
47
|
-
|
49
|
+
sp_lstchg - days since Jan 1, 1970 password was last
|
50
|
+
changed.
|
48
51
|
sp_min - days before which password may not be changed.
|
49
52
|
sp_max - days after which password must be changed.
|
50
53
|
sp_warn - days before password is to expire that user is
|
51
|
-
|
54
|
+
warned of pending password expiration.
|
52
55
|
sp_inact - days after password expires that account is
|
53
56
|
considered inactive and disabled.
|
54
57
|
sp_expire - days since Jan 1, 1970 when account will be
|
58
|
+
disabled
|
55
59
|
|
56
60
|
|
57
61
|
5. Description
|
data/extconf.rb
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
#
|
6
6
|
|
7
7
|
require 'mkmf'
|
8
|
+
require 'rbconfig'
|
8
9
|
|
9
10
|
$CFLAGS = case RUBY_VERSION
|
10
11
|
when /^1\.9/; '-DRUBY19'
|
@@ -12,33 +13,54 @@ $CFLAGS = case RUBY_VERSION
|
|
12
13
|
else; ''
|
13
14
|
end
|
14
15
|
|
15
|
-
|
16
|
+
implementation = case CONFIG['host_os']
|
17
|
+
when /linux/i; 'shadow'
|
18
|
+
when /sunos|solaris/i; 'shadow'
|
19
|
+
when /freebsd/i; 'pwd'
|
20
|
+
when /darwin/i; 'pwd'
|
21
|
+
else; nil
|
22
|
+
"This library works on OS X, FreeBSD, Solaris and Linux."
|
23
|
+
end
|
16
24
|
|
17
|
-
|
18
|
-
$LDFLAGS = ""
|
19
|
-
ok = have_func("getspent")
|
20
|
-
end
|
25
|
+
ok = true
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
ok &= have_func("lckpwdf")
|
26
|
-
ok &= have_func("ulckpwdf")
|
27
|
+
case implementation
|
28
|
+
when 'shadow'
|
29
|
+
#$LDFLAGS = "-lshadow"
|
27
30
|
|
28
|
-
if ok
|
29
|
-
|
30
|
-
|
31
|
+
if( ! (ok &= have_library("shadow","getspent")) )
|
32
|
+
$LDFLAGS = ""
|
33
|
+
ok = have_func("getspent")
|
31
34
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
35
|
+
|
36
|
+
ok &= have_func("fgetspent")
|
37
|
+
ok &= have_func("setspent")
|
38
|
+
ok &= have_func("endspent")
|
39
|
+
ok &= have_func("lckpwdf")
|
40
|
+
ok &= have_func("ulckpwdf")
|
41
|
+
|
42
|
+
if ok
|
43
|
+
if !have_func("sgetspent")
|
44
|
+
$CFLAGS += ' -DSOLARIS'
|
45
|
+
end
|
43
46
|
end
|
47
|
+
when 'pwd'
|
48
|
+
ok &= have_func("endpwent")
|
49
|
+
ok &= have_func("getpwent")
|
50
|
+
ok &= have_func("getpwnam")
|
51
|
+
ok &= have_func("getpwnam_r")
|
52
|
+
ok &= have_func("getpwuid")
|
53
|
+
ok &= have_func("setpassent")
|
54
|
+
ok &= have_func("setpwent")
|
55
|
+
|
56
|
+
have_header("uuid/uuid.h")
|
57
|
+
have_header("uuid.h")
|
58
|
+
else
|
59
|
+
ok = false
|
44
60
|
end
|
61
|
+
|
62
|
+
if ok
|
63
|
+
create_makefile("shadow", implementation)
|
64
|
+
else
|
65
|
+
raise "You are missing some of the required functions from either shadow.h on Linux/Solaris, or pwd.h on FreeBSD/OS X."
|
66
|
+
end
|
data/{depend → pwd/depend}
RENAMED
File without changes
|
data/pwd/shadow.c
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
/*
|
2
|
+
* shadow.c
|
3
|
+
*
|
4
|
+
* Ruby extention module for using FreeBSD/OS X pwd.h.
|
5
|
+
*
|
6
|
+
* Copyright (C) 1998-1999 by Takaaki.Tateishi(ttate@jaist.ac.jp)
|
7
|
+
* License: Free for any use with your own risk!
|
8
|
+
*/
|
9
|
+
#include <sys/types.h>
|
10
|
+
#include <pwd.h>
|
11
|
+
#include <time.h>
|
12
|
+
#ifdef HAVE_UUID_UUID_H
|
13
|
+
#include <uuid/uuid.h>
|
14
|
+
#elif HAVE_UUID_H
|
15
|
+
#include <uuid.h>
|
16
|
+
#endif
|
17
|
+
#define PWTYPE struct passwd
|
18
|
+
|
19
|
+
#include "ruby.h"
|
20
|
+
#ifdef RUBY19
|
21
|
+
#include <ruby/io.h>
|
22
|
+
#else
|
23
|
+
#include "rubyio.h"
|
24
|
+
#endif
|
25
|
+
|
26
|
+
#ifdef RUBY19
|
27
|
+
#define file_ptr(x) (x)->stdio_file
|
28
|
+
#else
|
29
|
+
#define file_ptr(x) (x)->f
|
30
|
+
#endif
|
31
|
+
|
32
|
+
static VALUE rb_mShadow;
|
33
|
+
static VALUE rb_mPasswd;
|
34
|
+
static VALUE rb_sPasswdEntry;
|
35
|
+
static VALUE rb_mGroup;
|
36
|
+
static VALUE rb_sGroupEntry;
|
37
|
+
static VALUE rb_eFileLock;
|
38
|
+
|
39
|
+
|
40
|
+
static VALUE
|
41
|
+
rb_shadow_setspent(VALUE self)
|
42
|
+
{
|
43
|
+
setpassent(1);
|
44
|
+
return Qnil;
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
static VALUE
|
49
|
+
rb_shadow_endspent(VALUE self)
|
50
|
+
{
|
51
|
+
endpwent();
|
52
|
+
return Qnil;
|
53
|
+
}
|
54
|
+
|
55
|
+
static VALUE convert_pw_struct( struct passwd *entry )
|
56
|
+
{
|
57
|
+
return rb_struct_new(rb_sPasswdEntry,
|
58
|
+
rb_tainted_str_new2(entry->pw_name),
|
59
|
+
rb_tainted_str_new2(entry->pw_passwd),
|
60
|
+
Qnil, /* date when the password was last changed (in days since Jan 1, 1970) */
|
61
|
+
Qnil, /* days that password must stay same */
|
62
|
+
Qnil, /* days until password changes. */
|
63
|
+
Qnil, /* days before expiration where user is warned */
|
64
|
+
Qnil, /* days after password expiration that account becomes inactive */
|
65
|
+
INT2FIX(difftime(entry->pw_change, 0) / (24*60*60)),
|
66
|
+
INT2FIX(difftime(entry->pw_expire, 0) / (24*60*60)),
|
67
|
+
Qnil, /* sp_flag */
|
68
|
+
NULL);
|
69
|
+
}
|
70
|
+
|
71
|
+
static VALUE
|
72
|
+
rb_shadow_getspent(VALUE self)
|
73
|
+
{
|
74
|
+
PWTYPE *entry;
|
75
|
+
VALUE result;
|
76
|
+
entry = getpwent();
|
77
|
+
|
78
|
+
if( entry == NULL )
|
79
|
+
return Qnil;
|
80
|
+
|
81
|
+
result = convert_pw_struct( entry );
|
82
|
+
return result;
|
83
|
+
}
|
84
|
+
|
85
|
+
static VALUE
|
86
|
+
rb_shadow_getspnam(VALUE self, VALUE name)
|
87
|
+
{
|
88
|
+
PWTYPE *entry;
|
89
|
+
VALUE result;
|
90
|
+
|
91
|
+
if( TYPE(name) != T_STRING )
|
92
|
+
rb_raise(rb_eException,"argument must be a string.");
|
93
|
+
entry = getpwnam(StringValuePtr(name));
|
94
|
+
|
95
|
+
if( entry == NULL )
|
96
|
+
return Qnil;
|
97
|
+
|
98
|
+
result = convert_pw_struct( entry );
|
99
|
+
return result;
|
100
|
+
}
|
101
|
+
|
102
|
+
void
|
103
|
+
Init_shadow()
|
104
|
+
{
|
105
|
+
rb_sPasswdEntry = rb_struct_define("PasswdEntry",
|
106
|
+
"sp_namp","sp_pwdp","sp_lstchg",
|
107
|
+
"sp_min","sp_max","sp_warn",
|
108
|
+
"sp_inact","pw_change",
|
109
|
+
"sp_expire","sp_flag", NULL);
|
110
|
+
rb_sGroupEntry = rb_struct_define("GroupEntry",
|
111
|
+
"sg_name","sg_passwd",
|
112
|
+
"sg_adm","sg_mem",NULL);
|
113
|
+
|
114
|
+
rb_mShadow = rb_define_module("Shadow");
|
115
|
+
rb_eFileLock = rb_define_class_under(rb_mShadow,"FileLock",rb_eException);
|
116
|
+
rb_mPasswd = rb_define_module_under(rb_mShadow,"Passwd");
|
117
|
+
rb_define_const(rb_mPasswd,"Entry",rb_sPasswdEntry);
|
118
|
+
rb_mGroup = rb_define_module_under(rb_mShadow,"Group");
|
119
|
+
rb_define_const(rb_mGroup,"Entry",rb_sGroupEntry);
|
120
|
+
|
121
|
+
rb_define_module_function(rb_mPasswd,"setspent",rb_shadow_setspent,0);
|
122
|
+
rb_define_module_function(rb_mPasswd,"endspent",rb_shadow_endspent,0);
|
123
|
+
rb_define_module_function(rb_mPasswd,"getspent",rb_shadow_getspent,0);
|
124
|
+
rb_define_module_function(rb_mPasswd,"getspnam",rb_shadow_getspnam,1);
|
125
|
+
}
|
data/ruby-shadow.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
'Remi Broemeling',
|
9
9
|
'Takaaki Tateishi']
|
10
10
|
|
11
|
-
spec.description = 'This module provides access to shadow passwords on Linux and Solaris'
|
11
|
+
spec.description = 'This module provides access to shadow passwords on Linux, OSX, FreeBSD, and Solaris'
|
12
12
|
spec.email = ['adam.palmblad@teampages.com']
|
13
13
|
spec.extensions = ['extconf.rb']
|
14
14
|
spec.files = []
|
@@ -19,6 +19,6 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.name = 'ruby-shadow'
|
20
20
|
spec.required_ruby_version = ['>= 1.8']
|
21
21
|
spec.summary = '*nix Shadow Password Module'
|
22
|
-
spec.version = '2.
|
22
|
+
spec.version = '2.3.1'
|
23
23
|
spec.license = "Public Domain License"
|
24
24
|
end
|
data/shadow/depend
ADDED
@@ -5,7 +5,6 @@
|
|
5
5
|
*
|
6
6
|
* Copyright (C) 1998-1999 by Takaaki.Tateishi(ttate@jaist.ac.jp)
|
7
7
|
* License: Free for any use with your own risk!
|
8
|
-
* Modified at: <1999/8/19 06:48:18 by ttate>
|
9
8
|
*/
|
10
9
|
|
11
10
|
#include <shadow.h>
|
@@ -17,11 +16,13 @@
|
|
17
16
|
#endif
|
18
17
|
|
19
18
|
#ifdef RUBY19
|
20
|
-
#define file_ptr(x) (x)
|
19
|
+
#define file_ptr(x) rb_io_stdio_file(x)
|
21
20
|
#else
|
22
21
|
#define file_ptr(x) (x)->f
|
23
22
|
#endif
|
24
23
|
|
24
|
+
#define NUM_FIELDS 10
|
25
|
+
|
25
26
|
static VALUE rb_mShadow;
|
26
27
|
static VALUE rb_mPasswd;
|
27
28
|
static VALUE rb_sPasswdEntry;
|
@@ -69,6 +70,7 @@ rb_shadow_sgetspent(VALUE self, VALUE str)
|
|
69
70
|
INT2FIX(entry->sp_max),
|
70
71
|
INT2FIX(entry->sp_warn),
|
71
72
|
INT2FIX(entry->sp_inact),
|
73
|
+
Qnil, /* used by BSD, pw_change, date when the password expires, in days since Jan 1, 1970 */
|
72
74
|
INT2FIX(entry->sp_expire),
|
73
75
|
INT2FIX(entry->sp_flag),
|
74
76
|
NULL);
|
@@ -85,7 +87,6 @@ rb_shadow_fgetspent(VALUE self, VALUE file)
|
|
85
87
|
|
86
88
|
if( TYPE(file) != T_FILE )
|
87
89
|
rb_raise(rb_eTypeError,"argument must be a File.");
|
88
|
-
|
89
90
|
entry = fgetspent( file_ptr( (RFILE(file)->fptr) ) );
|
90
91
|
|
91
92
|
if( entry == NULL )
|
@@ -99,6 +100,7 @@ rb_shadow_fgetspent(VALUE self, VALUE file)
|
|
99
100
|
INT2FIX(entry->sp_max),
|
100
101
|
INT2FIX(entry->sp_warn),
|
101
102
|
INT2FIX(entry->sp_inact),
|
103
|
+
Qnil, /* used by BSD, pw_change, date when the password expires, in days since Jan 1, 1970 */
|
102
104
|
INT2FIX(entry->sp_expire),
|
103
105
|
INT2FIX(entry->sp_flag),
|
104
106
|
NULL);
|
@@ -124,6 +126,7 @@ rb_shadow_getspent(VALUE self)
|
|
124
126
|
INT2FIX(entry->sp_max),
|
125
127
|
INT2FIX(entry->sp_warn),
|
126
128
|
INT2FIX(entry->sp_inact),
|
129
|
+
Qnil, /* used by BSD, pw_change, date when the password expires, in days since Jan 1, 1970 */
|
127
130
|
INT2FIX(entry->sp_expire),
|
128
131
|
INT2FIX(entry->sp_flag),
|
129
132
|
NULL);
|
@@ -152,6 +155,7 @@ rb_shadow_getspnam(VALUE self, VALUE name)
|
|
152
155
|
INT2FIX(entry->sp_max),
|
153
156
|
INT2FIX(entry->sp_warn),
|
154
157
|
INT2FIX(entry->sp_inact),
|
158
|
+
Qnil, /* used by BSD, pw_change, date when the password expires, in days since Jan 1, 1970 */
|
155
159
|
INT2FIX(entry->sp_expire),
|
156
160
|
INT2FIX(entry->sp_flag),
|
157
161
|
NULL);
|
@@ -164,14 +168,18 @@ rb_shadow_putspent(VALUE self, VALUE entry, VALUE file)
|
|
164
168
|
{
|
165
169
|
struct spwd centry;
|
166
170
|
FILE* cfile;
|
167
|
-
VALUE val[
|
171
|
+
VALUE val[NUM_FIELDS];
|
168
172
|
int i;
|
169
173
|
int result;
|
170
174
|
|
171
|
-
|
175
|
+
if( TYPE(file) != T_FILE )
|
176
|
+
rb_raise(rb_eTypeError,"argument must be a File.");
|
177
|
+
|
178
|
+
for(i=0; i<NUM_FIELDS; i++)
|
172
179
|
val[i] = RSTRUCT_PTR( entry )[i]; //val[i] = RSTRUCT(entry)->ptr[i];
|
173
180
|
cfile = file_ptr( RFILE(file)->fptr );
|
174
181
|
|
182
|
+
|
175
183
|
centry.sp_namp = StringValuePtr(val[0]);
|
176
184
|
centry.sp_pwdp = StringValuePtr(val[1]);
|
177
185
|
centry.sp_lstchg = FIX2INT(val[2]);
|
@@ -179,8 +187,8 @@ rb_shadow_putspent(VALUE self, VALUE entry, VALUE file)
|
|
179
187
|
centry.sp_max = FIX2INT(val[4]);
|
180
188
|
centry.sp_warn = FIX2INT(val[5]);
|
181
189
|
centry.sp_inact = FIX2INT(val[6]);
|
182
|
-
centry.sp_expire = FIX2INT(val[
|
183
|
-
centry.sp_flag = FIX2INT(val[
|
190
|
+
centry.sp_expire = FIX2INT(val[8]);
|
191
|
+
centry.sp_flag = FIX2INT(val[9]);
|
184
192
|
|
185
193
|
result = putspent(¢ry,cfile);
|
186
194
|
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-shadow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.3.1
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Adam Palmblad
|
@@ -13,9 +14,10 @@ authors:
|
|
13
14
|
autorequire:
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
|
-
date: 2013-
|
17
|
+
date: 2013-11-13 00:00:00.000000000 Z
|
17
18
|
dependencies: []
|
18
|
-
description: This module provides access to shadow passwords on Linux
|
19
|
+
description: This module provides access to shadow passwords on Linux, OSX, FreeBSD,
|
20
|
+
and Solaris
|
19
21
|
email:
|
20
22
|
- adam.palmblad@teampages.com
|
21
23
|
executables: []
|
@@ -24,35 +26,40 @@ extensions:
|
|
24
26
|
extra_rdoc_files: []
|
25
27
|
files:
|
26
28
|
- extconf.rb
|
27
|
-
- depend
|
28
29
|
- HISTORY
|
30
|
+
- LICENSE
|
29
31
|
- MANIFEST
|
30
32
|
- README
|
31
33
|
- README.euc
|
32
34
|
- ruby-shadow.gemspec
|
33
|
-
- shadow.c
|
35
|
+
- pwd/shadow.c
|
36
|
+
- pwd/depend
|
37
|
+
- shadow/shadow.c
|
38
|
+
- shadow/depend
|
34
39
|
homepage: https://github.com/apalmblad/ruby-shadow
|
35
40
|
licenses:
|
36
41
|
- Public Domain License
|
37
|
-
metadata: {}
|
38
42
|
post_install_message:
|
39
43
|
rdoc_options: []
|
40
44
|
require_paths:
|
41
45
|
- lib
|
42
46
|
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
43
48
|
requirements:
|
44
|
-
- - '>='
|
49
|
+
- - ! '>='
|
45
50
|
- !ruby/object:Gem::Version
|
46
51
|
version: '1.8'
|
47
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
48
54
|
requirements:
|
49
|
-
- - '>='
|
55
|
+
- - ! '>='
|
50
56
|
- !ruby/object:Gem::Version
|
51
57
|
version: '0'
|
52
58
|
requirements: []
|
53
59
|
rubyforge_project:
|
54
|
-
rubygems_version:
|
60
|
+
rubygems_version: 1.8.25
|
55
61
|
signing_key:
|
56
|
-
specification_version:
|
57
|
-
summary: '*nix Shadow Password Module'
|
62
|
+
specification_version: 3
|
63
|
+
summary: ! '*nix Shadow Password Module'
|
58
64
|
test_files: []
|
65
|
+
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: e6a1653f5597ff8d3d7766345624bac5a391bf0c
|
4
|
-
data.tar.gz: c0b3f349395f0a66f86aef57580044cd47cf7e3f
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: c5e7fb7ad3d9f82d84be27c0e21fb476b6b530e15b2d0fe49e9d88cd89e3c848cc45512db1eae38606ace6a8efa33e9897346196bcf3d6b90541ac10282bc964
|
7
|
-
data.tar.gz: adfff1ae1f2cfc6096baa0aab23cb467fca95561020c610bb417a8c1fe5c09229893142383e2131f2a929f2c1bea4c7d575b42f89c97c7f47e9b4fd6332b67cd
|