John Benediktsson
1abe794205
io.buffers: refactor buffer-read-until to use buffer-find.
2016-11-09 10:43:47 -08:00
John Benediktsson
4bebe98fa1
io.buffers: adding another test of buffer-read-until.
2016-11-09 10:11:51 -08:00
John Benediktsson
816d1e31d5
io.pipes: allow "|" separated strings in run-pipeline.
2016-11-09 09:56:34 -08:00
John Benediktsson
3cc16ccd9e
io.files.temp.unix: allowing TMPDIR to override /tmp.
2016-11-08 21:37:51 -08:00
John Benediktsson
deac792fc7
io.files.temp.unix: changing cache directory to use XDG spec.
...
Typically this means ~/.cache/factor.
2016-11-08 21:24:34 -08:00
John Benediktsson
fd13a94150
io.launcher: fix timeouts for process streams.
2016-11-08 20:57:47 -08:00
Björn Lindqvist
93661e9ea6
io.launcher.unix: better to use current-directory variable
2016-10-31 07:27:14 +01:00
Alexander Iljin
560caf8e4d
io.directories.search-docs: fix indentation
2016-10-30 14:18:53 -07:00
Alexander Iljin
924880cb50
Add cp437 8-bit encoding, AKA IBM437
2016-10-27 08:44:15 -07:00
John Benediktsson
2628dbc5c9
io.directories.search.windows: merging with io.standard-paths.windows.
2016-10-06 14:57:40 -07:00
John Benediktsson
303367c57a
io.launcher.windows: need to USE: io.launcher.private.
2016-10-06 13:50:04 -07:00
Alexander Iljin
65a2281188
io.launcher-docs: add notes on the hidden slot usage
2016-09-20 22:51:31 +03:00
Alexander Iljin
c822395597
io.launcher: hide processes created by (process-stream)
2016-09-20 06:59:43 -07:00
Alexander Iljin
85710ced87
io.launcher: add the hidden slot to the process tuple
...
Implemented on Windows only.
2016-09-20 06:59:43 -07:00
Björn Lindqvist
b0495b5fe3
io.backend.unix.tests: missed this none reference
2016-09-16 19:38:02 +02:00
Björn Lindqvist
20711a0fd3
Adding escaping to CHAR: " -> CHAR: \"
...
It is not necessary to escape the " character, but it doesn't hurt and
is necessary for syntax-highlighting (FUEL) to work correctly.
2016-09-04 06:40:43 +02:00
Björn Lindqvist
2f12413595
io.sockets.windows: WSASocket-flags not needed
2016-08-04 23:55:56 +02:00
John Benediktsson
b864d49e8c
io.sockets: adding docs and tests for port-protocol.
2016-08-01 10:22:16 -07:00
John Benediktsson
ab66a73744
io.sockets: adding port-protocol to match protocol-port.
2016-07-30 11:12:40 -07:00
Björn Lindqvist
ca2aef8e67
io.monitors.recursive: with-qualified-directory-files works here
2016-07-30 19:03:23 +02:00
Björn Lindqvist
ba4bb45d4d
io.directories.*: move of the qualified directory listing words to io.directories
2016-07-30 19:03:22 +02:00
Alexander Iljin
ebfce1deea
io.files.info-docs: fix links to file-info-tuple parameters
2016-07-30 09:25:30 -07:00
Alexander Iljin
2fd5654473
Add EOL at EOF for all authors.txt files for consistency
...
In some instances replaced CR/LF with LF.
2016-07-30 09:25:30 -07:00
John Benediktsson
6b12e2e3bc
use ?delete-file instead of [ delete-file ] ignore-errors.
2016-07-10 20:28:46 -07:00
John Benediktsson
e146309a0c
io.encodings.binary: move to core.
2016-06-30 12:30:58 -07:00
Alexander Iljin
ef29e0947f
io.directories.windows: remove synchronous copy-file implementation
2016-06-29 14:17:57 -07:00
Alexander Iljin
b43c7b4fd7
io.files.info.windows: suppress ERROR_FILE_NOT_FOUND in volume>paths
2016-06-22 11:27:26 -07:00
Alexander Iljin
b35294eade
io.sockets.secure-docs: update and add some documentation
2016-06-22 11:27:26 -07:00
Alexander Iljin
d243e00f54
io.files.windows: use open-file to implement maybe-create-file
...
This fixes error throwing in case of CreateFile failure, and calls
add-completion for the file handle on success.
2016-06-22 11:27:26 -07:00
Alexander Iljin
f530692362
io.files.windows: replace open-existing with open-r/w
...
This fixes error throwing in case of CreateFile failure, and calls
add-completion for the file handle on success.
2016-06-22 11:27:26 -07:00
Alexander Iljin
ae1c7b7a54
io.files.windows: use CreateFileW in open-file for consistency
2016-06-22 11:27:26 -07:00
Jon Harper
e9454fc310
io.files.info docs, sync link-info and file-info docs
2016-06-22 11:22:43 -07:00
Björn Lindqvist
6a76bf9084
io.directories.unix: normalize-path doesn't need to be called
...
It is already called by the words copy-file delegates to.
2016-06-15 01:25:53 +02:00
Björn Lindqvist
ea4333e490
io.directories: new utility word make-parent-directories, for making sure directories exists
2016-06-15 00:33:44 +02:00
Doug Coleman
c7041fe96e
io.sockets.secure.windows: Windows sockets are a bit confused. Make a word
...
to get the handle out of two different paths. Probably needs more
refactoring but this makes it work.
2016-06-02 11:07:19 -07:00
Doug Coleman
05083ba503
io.sockets.secure.windows: No need to call file>> because we have a
...
win32-socket on the stack already.
2016-06-02 10:56:50 -07:00
Doug Coleman
b63aaff1c5
io.sockets.secure: (server) needs a method on secure for Windows too. Move the method to a vocab that both platforms load.
2016-06-02 10:25:11 -07:00
Björn Lindqvist
a80aeea7f9
io.files.windows: make CreateFile-flags a normal word (fixes the recent test failures)
2016-05-31 17:04:34 +02:00
Alexander Iljin
8e2a65e5a2
io.files.info.windows: add a comment to open-read-handle
2016-05-30 12:35:26 -07:00
Alexander Iljin
aa7a285390
io.files.info.windows: fix flags in open-read-handle
...
Add FILE_SHARE_WRITE and FILE_SHARE_DELETE flags and calls CreateFile-flags
hook. This fixes file-readable? so that it uses the same flags as open-read
(issue #1470 ).
2016-05-30 12:35:25 -07:00
Alexander Iljin
ff26c3d39c
io.files.windows: add FILE_FLAG_BACKUP_SEMANTICS to CreateFile-flags
...
This provides additional access rights if the process has SE_BACKUP_NAME
or SE_RESTORE_NAME privileges. Does nothing otherwise.
2016-05-30 12:35:25 -07:00
Alexander Iljin
043c6984b9
io.files.info.windows: fix file-readable?
...
This fixes issue #1470 . Now the method tries to open the file handle for
reading and returns t on success. This approach makes Windows check the
current user's permissions.
2016-05-30 12:35:24 -07:00
Alexander Iljin
2264638a61
io.files.info.windows: add open-read-handle to reuse later
2016-05-30 12:35:23 -07:00
Alexander Iljin
2b68636207
io.files.info.windows: fix parameter name for get-file-information-stat
2016-05-30 12:35:23 -07:00
Doug Coleman
3494576ad8
io.files.windows: Add a unit test to make sure shared flags stay on.
2016-05-30 12:24:17 -07:00
Doug Coleman
3307876cc2
io.files.unique: clean up the files that are created if not all files can be created.
2016-05-26 14:05:58 -07:00
Doug Coleman
a399439a5f
io.files.unique: Make sure the files are the same except for the suffix. Add unit test. Fix paths typo.
2016-05-25 17:49:59 -07:00
Doug Coleman
e19df707da
io.servers: Fix a regression where we couldn't listen on several ports at once.
2016-05-23 15:28:51 -07:00
Doug Coleman
48d9b2b4eb
io.files.unique: Add a way to create multiple unique files at the same time. If any of them fail, then the whole operation fails.
2016-05-23 13:17:29 -07:00
Alexander Iljin
1e0bf40b7f
docs: minor fixes and amendments.
2016-05-22 07:53:21 -07:00
John Benediktsson
9439c5a684
io.encodings.iso2022: stop using sets:unique.
2016-04-18 21:10:17 -07:00
Doug Coleman
9427c78506
ui.debugger: quotation stack effect wants ( .. -- * ), throw causes infinite loop, but rethrow works. change previous patch to rethrow everywhere.
2016-04-06 17:35:13 -07:00
Doug Coleman
363e08b6a8
factor: fix whitespace at end of files.
2016-04-06 16:53:25 -07:00
John Benediktsson
5cfd5ff224
io.streams.byte-array.fast: don't need >c-ptr.
2016-04-06 12:39:50 -07:00
Doug Coleman
49be5b2c52
io.directories.search: Fix unit test using list.
2016-04-05 14:49:27 -07:00
John Benediktsson
2269b07d33
use with-temp-file and with-temp-directory in some tests.
2016-04-04 10:33:03 -07:00
John Benediktsson
c09312d881
io.files.unix: more test cleanup.
2016-03-31 21:32:05 -07:00
John Benediktsson
68b0f7d0f0
io: fix some temp-file uses in tests.
2016-03-31 21:32:05 -07:00
John Benediktsson
d2daa05790
io: fix some temp-files in the tests to use unique-files.
2016-03-31 00:23:13 -07:00
John Benediktsson
498285d7dd
unicode: make this the API for all unicode things.
2016-03-30 23:29:48 -07:00
Doug Coleman
95dc2f89e5
io.mmap: Clean up mmap tests so they can run at the same time.
2016-03-30 16:29:06 -07:00
Doug Coleman
9b3e522869
io.monitors.linux: fix a set.
2016-03-29 18:27:47 -07:00
John Benediktsson
71ef8a22c2
disambiguate namespaces:set and sets:set.
2016-03-29 17:14:42 -07:00
John Benediktsson
3f18b71d07
cleanup some QUALIFIED: that are no longer needed.
2016-03-29 10:20:16 -07:00
John Benediktsson
7d0c596c92
Hopefully fix stack effects of error hooks to throw when required.
2016-03-28 22:27:35 -07:00
Doug Coleman
d3bc2035a2
factor: remove rest of double paren words.
2016-03-25 03:13:27 -07:00
Björn Lindqvist
0bb3228063
unix: fixed read-symbolic-link ( #1074 ) + tests
2016-03-23 16:15:30 +01:00
Björn Lindqvist
53467d4e21
io.files.unix: loop getcwd with an expanding buffer, fixes part of #1074
...
It appears that the right way to do it is using an arbitrary sized buffer
and just expanding it in case getcwd reports ERANGE.
2016-03-23 16:15:29 +01:00
Björn Lindqvist
579875821b
VM: removes the OBJ-ERROR special object in favor of a constant
...
The special object contained the string "kernel-error" which were used
to tag VM errors. But it is simplier and removes a little complexity to
just tag them with a fixnum constant.
2016-03-22 17:52:19 +01:00
John Benediktsson
50759f4bc6
io.files.unique: change cleanup-unique-file quot stack effect.
2016-03-19 13:03:15 -07:00
John Benediktsson
bde8f522f1
fix some tests broken by my io.files.unique change.
2016-03-19 09:50:01 -07:00
John Benediktsson
9c323e2884
cleanup some uses of current-directory.
2016-03-18 17:04:05 -07:00
John Benediktsson
e36727db23
io.files.unique: some cleanup.
2016-03-18 16:54:17 -07:00
John Benediktsson
baae677276
io.files.unique: change to create unique files and directories relative to the current-directory.
2016-03-18 10:57:54 -07:00
John Benediktsson
f5b31a85c0
io.monitors: change tests to not use unique because it only ever used temp-file.
2016-03-18 10:36:45 -07:00
John Benediktsson
7c2e8d0fad
io.launcher.unix: simplify use of temp-directory.
2016-03-18 10:36:45 -07:00
John Benediktsson
32b29f7079
io.files.info: cleanup by using with-temp-directory.
2016-03-17 17:51:36 -07:00
John Benediktsson
2e85dd2eb3
io.directories: simplify tests by using with-temp-directory.
2016-03-17 17:11:59 -07:00
Doug Coleman
d4b8e44399
license rename: fix the rest of it.
2016-03-17 02:36:34 -07:00
John Benediktsson
73de6246b7
io.files.temp: use a startup hook as the temp directory could change from run to run.
2016-03-16 21:40:25 -07:00
Doug Coleman
2aadc94b10
io.files.temp: Initialize symbols after the backends are loaded. Top level code sucks.
2016-03-16 21:25:19 -07:00
John Benediktsson
33b6c0426d
io.files.temp: allow changing of current temp and cache directory.
2016-03-16 15:19:10 -07:00
John Benediktsson
497f8cb514
Update tests for LICENSE.txt rename.
2016-03-16 10:13:56 -07:00
John Benediktsson
ebfa9402d4
io.sockets.unix: using getsockopt doesn't need to recurse.
2016-03-14 08:42:54 -07:00
Doug Coleman
bb7161a46f
io.sockets.secure.windows: Add some code for loading the certificates on
...
windows. Still disabled, and the CA certificates are duplicated.
2016-03-13 16:11:45 -07:00
John Benediktsson
a58a2ff7b0
io.sockets.unix: don't need these imports.
2016-03-13 13:43:57 -07:00
John Benediktsson
cd90435588
io.sockets.unix: refactor getsockopt into get-socket-option.
2016-03-13 13:34:29 -07:00
John Benediktsson
b3fbafcf92
io.sockets.unix: adding tests for connection refused.
2016-03-13 13:15:45 -07:00
John Benediktsson
3fdbbe0fea
io.sockets.unix: use getsockopt to check connect success.
2016-03-13 13:08:26 -07:00
Doug Coleman
460555785c
io.sockets.secure.openssl: Fix docs.
2016-03-13 01:45:52 -08:00
Doug Coleman
df3f58ae61
io.sockets.secure.openssl: Fix subject-name-match? for wildcard domains.
...
Also remove duplicate names before checking.
2016-03-12 20:22:47 -08:00
Benjamin Pollack
b0d62bcdc3
io.sockets.secure: add SNI support for Windows
...
M: secure ((client)) is identical between Unix and Windows, so this probably
could be moved out of the platform-specific vocab, but doing it sanely would
require a refactor I'm not excited about, so punting on that for now.
Fixes #1551
2016-03-12 09:27:31 -05:00
Björn Lindqvist
2713153273
io.sockets.tests: these needs to be conditional, in case you are ipv4 only
2016-03-10 04:11:23 +01:00
Doug Coleman
a1f3378365
io.sockets: Default make-sockaddr-outgoing to make-sockaddr.
2016-03-08 09:21:49 -08:00
Doug Coleman
3cd2775855
io.sockets.unix: Fix ipv6 sends for udp on osx.
2016-03-08 04:46:26 -08:00
Doug Coleman
a12a56f777
io.sockets: Special-case 0.0.0.0 and f for outgoing sockets so we can use
...
them on windows. Add some tests that shouldn't fail. Fixes #85 .
2016-03-08 02:27:01 -08:00
Doug Coleman
027a9fb1a2
io.sockets: Fix send-once for inet6.
2016-03-07 16:58:56 -08:00
Doug Coleman
05a8ac2423
Revert "io.sockets: Windows doesn't recognize 0.0.0.0. Add a method for"
...
This reverts commit 2c82dfb51b
.
2016-03-07 14:31:40 -08:00
Doug Coleman
2c82dfb51b
io.sockets: Windows doesn't recognize 0.0.0.0. Add a method for
...
resolve-localhost for Windows, and make the default ipv4 make-sockaddr use
127.0.0.1 since we are making a sockaddr for ipv4 anyway and 127.0.0.1 is
cross-platform. Fixes #85 .
2016-03-07 14:07:01 -08:00
Doug Coleman
334cc880ec
io.standard-paths.windows: We call >lower on the paths being compared, but
...
not on the original file we are looking for. So searching for something
like "Code.exe" would never find it. Fixed.
2016-03-07 13:21:30 -08:00
John Benediktsson
ee134373f0
ip-parser: some cleanup, move ipv6 parsing here.
2016-03-05 09:51:37 -08:00
Benjamin Pollack
e707374085
Make <inet4> and <ipv4> use ip-parser:parse-ipv4
...
Fixes #1209
2016-03-05 09:11:56 -05:00
Doug Coleman
a303637850
io.sockets.secure.windows: Try to fix compile error.
2016-03-05 02:57:39 -08:00
Doug Coleman
c077ee91e9
openssl: More ciphers.
2016-03-04 18:42:35 +00:00
Doug Coleman
46c9143232
openssl: call SSL_CTX_set_ecdh_auto() for forward secrecy.
2016-03-04 10:05:09 -08:00
Doug Coleman
0bfe6ff826
openssl: support more protocols for forward secrecy.
2016-03-04 09:19:08 -08:00
Doug Coleman
3576c0930c
openssl: Prefer tls1.2. Only use secure ciphers.
2016-03-04 09:15:12 -08:00
Benjamin Pollack
e83e791a7a
Do not attempt to set an SNI hostname on a server
2016-03-03 13:58:31 -08:00
Benjamin Pollack
62d1425971
Add SNI support to Factor
...
Fixes #1527
2016-03-03 09:48:20 -08:00
Benjamin Pollack
bfd656df17
Dump everything before TLSv1
...
All versions of SSL are deprecated and have major security issues. Just
kill the whole thing. If you want to deliberately expose yourself to
POODLE, you can do it on your own time.
2016-03-01 19:43:06 -05:00
Doug Coleman
3f07cbd194
io.sockets.secure.openssl: Nuke RSA.
2016-03-01 14:02:47 -08:00
Benjamin Pollack
12af22f3ee
openssl: only set RSA keys if required to do so
...
Modern OpenSSL and LibreSSL both do not require SSL_CTX_set_tmp_rsa to
be called unless SSL_CTX_need_tmp_rsa returns true, and LibreSSL and
OpenSSL compiled with deprecation warnings both will fail if this
happens. This commit resolves that.
With this change, it becomes possible to use LibreSSL in place of
OpenSSL with Factor.
2016-02-23 08:11:04 -05:00
Benjamin Pollack
8073c8a77e
Update OpenSSL calls to work with LibreSSL/newer OpenSSL
...
RSA_generate_key has been deprecated, and is not available in either
LibreSSL or newer OpenSSL that are not compiled with deprecated call
support. This commit switches to the still-supported
RSA_generate_key_ex, which is supported by both libraries.
Note that this is still insufficient for Factor to work under LibreSSL,
though we now get a call further than before.
2016-02-22 14:21:39 -08:00
Doug Coleman
69d5a3a276
io.sockets: remove send-n-times, broadcast-n-times.
2016-02-20 18:37:08 -08:00
Doug Coleman
e4347f5254
io.sockets: Add more utility words for working with udp.
2016-02-19 19:21:13 -08:00
Doug Coleman
67e7874e91
io.files.info.unix.linux: Special characters in mount points are encoded as octal escape sequences.
2015-11-03 15:55:14 -08:00
Doug Coleman
acdd529983
io.monitors.windows: ADS pathnames crashing the monitors threads is the
...
real culprit. Back out change and print out the crash and error message instead of ignoring
errors!
2015-11-02 21:19:12 -08:00
Doug Coleman
51ecaa5ab4
io.files.windows: ALIEN: -1 puts an expired alien in the image. -1 <alien>
...
it is then.
2015-11-02 21:18:49 -08:00
Doug Coleman
d645b2e17c
io.monitors.windows: Strip the :Zone.Identifier from pathnames reported
...
by the file change api.
2015-11-01 19:58:05 -08:00
Doug Coleman
26e5c1aecf
windows.kernel32, io.files.windows: Add support for listing alternate data
...
streams, e.g. file paths like foo.txt:Zone.Identifier.
2015-11-01 18:17:51 -08:00
Björn Lindqvist
575da3e478
VM: fix so that errno is set if MoveFileEx fails, should fix #1490
2015-10-12 12:19:21 +02:00
Björn Lindqvist
37cd54cfbb
io.files.windows.tests: windows test for the save-image not failing failure #1489
...
this one really should always throw permission denied or else something
is very spooky
2015-10-11 04:21:43 +02:00
Björn Lindqvist
e35087fb22
io.files.windows: fix incorrect parsing of file attribute bitfield in win32-file-attributes
2015-10-11 04:11:30 +02:00
Doug Coleman
db793e06f6
io.files.windows: SetFilePointer takes a PLONG not a uint pointer.
2015-10-09 19:50:06 -07:00
Doug Coleman
78f9fe9053
io.monitors.windows: make a DWORD ref instead of a uint. probably
...
irrelevant but it's what the win32 api header uses.
2015-10-09 19:21:24 -07:00
Björn Lindqvist
75b8b4a408
io.servers: filter the list of addrspecs in listen-on so that only
...
usable ones remains
"localhost" resolve-host can return unusable ipv6 addresses on hosts not
supporting ipv6. So a filtering step is needed in listen-on.
2015-10-08 15:08:07 +02:00
Björn Lindqvist
0a3b4b4872
io.sockets.secure.debug: use <test-secure-config> in some places
...
the word can be reused in a few places when setting up ssl. it removes
some duplicated code
2015-10-04 01:25:11 +02:00
Björn Lindqvist
dbcfc178ff
io.directories.unix,environment.unix: better to use
...
native-string-encoding over hardcoding utf8
2015-10-01 15:52:51 +02:00
Alexander Iljin
156a2d0b90
Minor documentation fixes.
2015-09-29 09:12:29 -07:00
John Benediktsson
924fc60e30
io.ports: bring back file read performance, ignoring zeroes.
2015-09-23 20:07:53 -07:00
Doug Coleman
84e0034168
io.standard-paths.unix: iterm2 integration has some spew before every bash command if you have enabled shell integration. these commands end in ascii 7, so find the last one, strip it off, and then split on ":". Fixes the mac graphviz install problem.
2015-09-23 17:11:47 -07:00
John Benediktsson
59caf874a3
syntax: removing #! as a comment character.
...
We don't need two types of comments and shebang (#!) is handled
natively by the lexer, so the original reason for #! is not valid.
2015-09-09 18:28:08 -07:00
John Benediktsson
e477f6996f
Fix comments to be ! not #!.
2015-09-08 16:15:10 -07:00
John Benediktsson
ceb75057da
change ERROR: words from throw-foo back to foo.
2015-08-13 16:13:05 -07:00
John Benediktsson
c9bd438d18
io.launcher: fix bad refactor.
2015-08-13 06:51:44 -07:00
Doug Coleman
b6be8685c3
basis: ERROR: changes.
2015-08-13 03:20:39 -07:00
Doug Coleman
02008979d9
factor: Change ERROR: foo ; to define ``throw-foo`` instead of having ``foo`` throw implicitly. The old ``foo`` still throws implicitly because this is a big change to get right in one patch, but it should be removed soon.
2015-08-12 15:26:18 -05:00
Doug Coleman
e0d1b14e5c
factor: don't need FROM: namespaces => set or namespaces:set anymore
2015-08-12 11:25:57 -05:00
Doug Coleman
46587f8457
factor: arch -> arch-name. fix breakage caused by other patch.
2015-08-12 11:08:24 -05:00
Doug Coleman
16fac5981e
io.styles: image -> image-style in docs too
2015-08-12 09:09:41 -05:00
Doug Coleman
330c7ba156
factor: Removing SLOT: nth/at/global in favor of using change: at for tuple slots named ``at`` and change-at for hashtables.
...
Redo many FROM: and QUALIFIED: and using lists.
2015-08-12 08:49:02 -05:00
Doug Coleman
00338f62f3
factor: put inline on same line as ; for experimentation
2015-08-10 12:55:27 -05:00
John Benediktsson
2a3427bdff
io.files.info: use directory?, symbolic-link?, and regular-file?.
2015-08-05 18:33:35 -07:00
Doug Coleman
23899e2d83
io.files.windows: Need the SLOT: file from io.sockets.secure.openssl
2015-07-30 00:05:37 -07:00
John Benediktsson
823524c3a0
io.backend.unix.macosx: change to << require >>.
2015-07-28 19:33:24 -07:00
John Benediktsson
e26493b97b
io.backend.unix.macosx: change USE: to require.
2015-07-28 19:13:29 -07:00
Björn Lindqvist
5e29aac0a6
Docs: various more compiler-related docs
2015-07-28 17:58:28 -07:00
Doug Coleman
1fcf96cada
factor: remove """ string syntax for now. there are HEREDOC:, STRING:, escaping \", and something else soon.
2015-07-25 22:59:56 -07:00
Doug Coleman
89ffe8fa82
io.encodints.iso2022: fix unit tests
2015-07-21 19:33:08 -07:00
Doug Coleman
c1a330ac7a
io.encodings.iso2022: use $ instead of making ESC a parsing word.
2015-07-21 17:33:14 -07:00