From 449bcb8403adfb9724805d02a51aea76046de185 Mon Sep 17 00:00:00 2001 From: "deraadt@openbsd.org" Date: Wed, 23 Feb 2022 19:01:00 +0000 Subject: [PATCH 001/287] upstream: and we go back to testing sftp-scp after the 8.9 release... OpenBSD-Commit-ID: a80440168258adca543a4607b871327a279c569c --- scp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scp.c b/scp.c index 519bffa1b..04f1a649b 100644 --- a/scp.c +++ b/scp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.245 2022/02/10 04:12:38 djm Exp $ */ +/* $OpenBSD: scp.c,v 1.246 2022/02/23 19:01:00 deraadt Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -449,7 +449,7 @@ main(int argc, char **argv) const char *errstr; extern char *optarg; extern int optind; - enum scp_mode_e mode = MODE_SCP; + enum scp_mode_e mode = MODE_SFTP; char *sftp_direct = NULL; /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ From a4537e79ab4ac6db4493c5158744b9ebde5efcb0 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 23 Feb 2022 21:21:16 +0000 Subject: [PATCH 002/287] upstream: put back the scp manpage changes for SFTP mode too OpenBSD-Commit-ID: 05dc53921f927e1b5e5694e1f3aa314549f2e768 --- scp.1 | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/scp.1 b/scp.1 index c433f7168..3af6ece1e 100644 --- a/scp.1 +++ b/scp.1 @@ -8,9 +8,9 @@ .\" .\" Created: Sun May 7 00:14:37 1995 ylo .\" -.\" $OpenBSD: scp.1,v 1.107 2022/02/10 04:12:38 djm Exp $ +.\" $OpenBSD: scp.1,v 1.108 2022/02/23 21:21:16 djm Exp $ .\" -.Dd $Mdocdate: February 10 2022 $ +.Dd $Mdocdate: February 23 2022 $ .Dt SCP 1 .Os .Sh NAME @@ -76,7 +76,9 @@ The options are as follows: Copies between two remote hosts are transferred through the local host. Without this option the data is copied directly between the two remote hosts. -Note that, when using the original SCP protocol (the default), this option +Note that, when using the legacy SCP protocol (via the +.Fl O +flag), this option selects batch mode for the second host as .Nm cannot ask for passwords or passphrases for both hosts. @@ -109,7 +111,7 @@ This option is directly passed to .Xr ssh 1 . .It Fl D Ar sftp_server_path When using the SFTP protocol support via -.Fl s , +.Fl M , connect directly to a local SFTP server program rather than a remote one via .Xr ssh 1 . @@ -141,13 +143,12 @@ This option is directly passed to .It Fl l Ar limit Limits the used bandwidth, specified in Kbit/s. .It Fl O -Use the original SCP protocol for file transfers instead of the SFTP protocol. +Use the legacy SCP protocol for file transfers instead of the SFTP protocol. Forcing the use of the SCP protocol may be necessary for servers that do not implement SFTP, for backwards-compatibility for particular filename wildcard patterns and for expanding paths with a .Sq ~ prefix for older SFTP servers. -This mode is the default. .It Fl o Ar ssh_option Can be used to pass options to .Nm ssh @@ -257,8 +258,6 @@ to use for the encrypted connection. The program must understand .Xr ssh 1 options. -.It Fl s -Use the SFTP protocol for transfers rather than the original scp protocol. .It Fl T Disable strict filename checking. By default when copying files from a remote host to a local directory @@ -295,12 +294,17 @@ debugging connection, authentication, and configuration problems. is based on the rcp program in .Bx source code from the Regents of the University of California. +.Pp +Since OpenSSH 8.8, +.Nm +has use the SFTP protocol for transfers by default. .Sh AUTHORS .An Timo Rinne Aq Mt tri@iki.fi .An Tatu Ylonen Aq Mt ylo@cs.hut.fi .Sh CAVEATS -The original SCP protocol (used by default) requires execution of the -remote user's shell to perform +The legacy SCP protocol (selected by the +.Fl O +flag) requires execution of the remote user's shell to perform .Xr glob 3 pattern matching. This requires careful quoting of any characters that have special meaning to From 3383b2cac0e9275bc93c4b4760e6e048f537e1d6 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 23 Feb 2022 21:21:49 +0000 Subject: [PATCH 003/287] upstream: free(3) wants stdlib.h OpenBSD-Commit-ID: 227a8c70a95b4428c49e46863c9ef4bd318a3b8a --- auth-rhosts.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth-rhosts.c b/auth-rhosts.c index cac5cd84d..4fc9252a6 100644 --- a/auth-rhosts.c +++ b/auth-rhosts.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth-rhosts.c,v 1.55 2022/02/23 11:15:57 djm Exp $ */ +/* $OpenBSD: auth-rhosts.c,v 1.56 2022/02/23 21:21:49 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -19,6 +19,7 @@ #include #include +#include #ifdef HAVE_NETGROUP_H # include #endif @@ -26,7 +27,7 @@ #include #include #include -#include +#include #include #include "packet.h" From f107467179428a0e3ea9e4aa9738ac12ff02822d Mon Sep 17 00:00:00 2001 From: Colin Watson Date: Thu, 24 Feb 2022 16:04:18 +0000 Subject: [PATCH 004/287] Improve detection of -fzero-call-used-regs=all support GCC doesn't tell us whether this option is supported unless it runs into the situation where it would need to emit corresponding code. --- m4/openssh.m4 | 3 +++ 1 file changed, 3 insertions(+) diff --git a/m4/openssh.m4 b/m4/openssh.m4 index 4f9c3792d..8c33c701b 100644 --- a/m4/openssh.m4 +++ b/m4/openssh.m4 @@ -14,6 +14,8 @@ AC_DEFUN([OSSH_CHECK_CFLAG_COMPILE], [{ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ #include #include +/* Trivial function to help test for -fzero-call-used-regs */ +void f(int n) {} int main(int argc, char **argv) { (void)argv; /* Some math to catch -ftrapv problems in the toolchain */ @@ -21,6 +23,7 @@ int main(int argc, char **argv) { float l = i * 2.1; double m = l / 0.5; long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; + f(0); printf("%d %d %d %f %f %lld %lld\n", i, j, k, l, m, n, o); /* * Test fallthrough behaviour. clang 10's -Wimplicit-fallthrough does From 3016ba47035ac3561aabd48e2be70167fe157d6a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 25 Feb 2022 11:37:11 +1100 Subject: [PATCH 005/287] Add tests for latest releases of {Libre,Open}SSL. --- .github/workflows/c-cpp.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 5ee896308..b778c9804 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -46,6 +46,7 @@ jobs: - { os: ubuntu-latest, configs: libressl-3.2.6 } - { os: ubuntu-latest, configs: libressl-3.3.4 } - { os: ubuntu-latest, configs: libressl-3.4.1 } + - { os: ubuntu-latest, configs: libressl-3.5.0 } - { os: ubuntu-latest, configs: openssl-master } - { os: ubuntu-latest, configs: openssl-noec } - { os: ubuntu-latest, configs: openssl-1.0.1 } @@ -54,7 +55,9 @@ jobs: - { os: ubuntu-latest, configs: openssl-1.1.0h } - { os: ubuntu-latest, configs: openssl-1.1.1 } - { os: ubuntu-latest, configs: openssl-1.1.1k } + - { os: ubuntu-latest, configs: openssl-1.1.1m } - { os: ubuntu-latest, configs: openssl-3.0.0 } + - { os: ubuntu-latest, configs: openssl-3.0.1 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - { os: ubuntu-18.04, configs: pam } From 54a86f4f6e1c43a2ca2be23ef799ab8910d4af70 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 25 Feb 2022 13:23:04 +1100 Subject: [PATCH 006/287] Use PICFLAG instead of hard coding -fPIC. --- Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 065bf91e3..a9b802b7d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -688,7 +688,7 @@ SK_DUMMY_LIBRARY=@SK_DUMMY_LIBRARY@ $(CC) $(CFLAGS_NOPIE) $(PICFLAG) $(CPPFLAGS) -c $< -o $@ regress/misc/sk-dummy/sk-dummy.so: $(SK_DUMMY_OBJS) - $(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -shared -o $@ $(SK_DUMMY_OBJS) \ + $(CC) $(CFLAGS) $(CPPFLAGS) $(PICFLAG) -shared -o $@ $(SK_DUMMY_OBJS) \ -L. -Lopenbsd-compat -lopenbsd-compat $(LDFLAGS_NOPIE) $(LIBS) regress-binaries: regress-prep $(LIBCOMPAT) \ From 1b2920e3b63db2eddebeec7330ffe8b723055573 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 25 Feb 2022 13:50:56 +1100 Subject: [PATCH 007/287] ANSIfy getshort and getlong. These functions appear to have come from OpenBSD's lib/libc/net/res_comp.c which made this change in 2005. --- openbsd-compat/getrrsetbyname.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c index dc6fe0533..caadceb64 100644 --- a/openbsd-compat/getrrsetbyname.c +++ b/openbsd-compat/getrrsetbyname.c @@ -89,7 +89,7 @@ struct __res_state _res; #ifndef GETSHORT #define GETSHORT(s, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ + u_char *t_cp = (u_char *)(cp); \ (s) = ((u_int16_t)t_cp[0] << 8) \ | ((u_int16_t)t_cp[1]) \ ; \ @@ -99,7 +99,7 @@ struct __res_state _res; #ifndef GETLONG #define GETLONG(l, cp) { \ - register u_char *t_cp = (u_char *)(cp); \ + u_char *t_cp = (u_char *)(cp); \ (l) = ((u_int32_t)t_cp[0] << 24) \ | ((u_int32_t)t_cp[1] << 16) \ | ((u_int32_t)t_cp[2] << 8) \ @@ -115,30 +115,28 @@ struct __res_state _res; #ifndef HAVE__GETSHORT static u_int16_t -_getshort(msgp) - register const u_char *msgp; +_getshort(const u_char *msgp) { - register u_int16_t u; + u_int16_t u; GETSHORT(u, msgp); return (u); } #elif defined(HAVE_DECL__GETSHORT) && (HAVE_DECL__GETSHORT == 0) -u_int16_t _getshort(register const u_char *); +u_int16_t _getshort(const u_char *); #endif #ifndef HAVE__GETLONG static u_int32_t -_getlong(msgp) - register const u_char *msgp; +_getlong(const u_char *msgp) { - register u_int32_t u; + u_int32_t u; GETLONG(u, msgp); return (u); } #elif defined(HAVE_DECL__GETLONG) && (HAVE_DECL__GETLONG == 0) -u_int32_t _getlong(register const u_char *); +u_int32_t _getlong(const u_char *); #endif /* ************** */ From 8e206e0dd6b9f757b07979e48f53ad5bf9b7b52b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 25 Feb 2022 15:14:22 +1100 Subject: [PATCH 008/287] Constify utimes in compat library to match specs. Patch from vapier at chromium.org. --- openbsd-compat/bsd-misc.c | 2 +- openbsd-compat/bsd-misc.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c index 059b6d3b3..d9c9b2671 100644 --- a/openbsd-compat/bsd-misc.c +++ b/openbsd-compat/bsd-misc.c @@ -107,7 +107,7 @@ const char *strerror(int e) #endif #ifndef HAVE_UTIMES -int utimes(char *filename, struct timeval *tvp) +int utimes(const char *filename, struct timeval *tvp) { struct utimbuf ub; diff --git a/openbsd-compat/bsd-misc.h b/openbsd-compat/bsd-misc.h index 2206e1a82..61ead1b7f 100644 --- a/openbsd-compat/bsd-misc.h +++ b/openbsd-compat/bsd-misc.h @@ -62,7 +62,7 @@ struct timeval { } #endif /* HAVE_STRUCT_TIMEVAL */ -int utimes(char *, struct timeval *); +int utimes(const char *, struct timeval *); #endif /* HAVE_UTIMES */ #ifndef AT_FDCWD From 0132056efabc5edb85c3c7105d2fb6dee41843c6 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 25 Feb 2022 19:47:48 +1100 Subject: [PATCH 009/287] Improve handling of _getshort and _getlong. If the system native ones are exactly as required then use them, otherwise use the local versions mapped to another name to prevent name collisions. --- openbsd-compat/getrrsetbyname.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c index caadceb64..cc1f8ae51 100644 --- a/openbsd-compat/getrrsetbyname.c +++ b/openbsd-compat/getrrsetbyname.c @@ -109,11 +109,18 @@ struct __res_state _res; } #endif +/* + * If the system doesn't have _getshort/_getlong or that are not exactly what + * we need then use local replacements, avoiding name collisions. + */ +#if !defined(HAVE__GETSHORT) || !defined(HAVE__GETLONG) || \ + !defined(HAVE_DECL__GETSHORT) || HAVE_DECL__GETSHORT == 0 || \ + !defined(HAVE_DECL__GETLONG) || HAVE_DECL__GETLONG == 0 +#define _getshort(x) (_ssh_compat_getshort(x)) +#define _getlong(x) (_ssh_compat_getlong(x)) /* * Routines to insert/extract short/long's. */ - -#ifndef HAVE__GETSHORT static u_int16_t _getshort(const u_char *msgp) { @@ -122,11 +129,7 @@ _getshort(const u_char *msgp) GETSHORT(u, msgp); return (u); } -#elif defined(HAVE_DECL__GETSHORT) && (HAVE_DECL__GETSHORT == 0) -u_int16_t _getshort(const u_char *); -#endif -#ifndef HAVE__GETLONG static u_int32_t _getlong(const u_char *msgp) { @@ -135,8 +138,6 @@ _getlong(const u_char *msgp) GETLONG(u, msgp); return (u); } -#elif defined(HAVE_DECL__GETLONG) && (HAVE_DECL__GETLONG == 0) -u_int32_t _getlong(const u_char *); #endif /* ************** */ From 284b6e5394652d519e31782e3b3cdfd7b21d1a81 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Feb 2022 14:06:14 +1100 Subject: [PATCH 010/287] Allow ppoll_time64 in seccomp sandbox. Should fix sandbox violations on (some? at least i386 and armhf) 32bit Linux platforms. Patch from chutzpahu at gentoo.org and cjwatson at debian.org via bz#3396. --- sandbox-seccomp-filter.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c index 2e065ba3e..4ce80cb2a 100644 --- a/sandbox-seccomp-filter.c +++ b/sandbox-seccomp-filter.c @@ -276,6 +276,9 @@ static const struct sock_filter preauth_insns[] = { #ifdef __NR_ppoll SC_ALLOW(__NR_ppoll), #endif +#ifdef __NR_ppoll_time64 + SC_ALLOW(__NR_ppoll_time64), +#endif #ifdef __NR_poll SC_ALLOW(__NR_poll), #endif From 96558ecd87adac62efa9a2b5479f686ab86b0be1 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Feb 2022 14:10:41 +1100 Subject: [PATCH 011/287] Add debian-i386 test target. --- .github/workflows/selfhosted.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 09f7af939..6b2cbd737 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -19,6 +19,7 @@ jobs: - ARM64 - alpine - bbone + - debian-i386 - dfly30 - dfly48 - dfly58 @@ -49,6 +50,7 @@ jobs: # Then we include any extra configs we want to test for specific VMs. include: - { os: ARM64, configs: pam } + - { os: debian-i386, configs: pam } - { os: dfly30, configs: without-openssl} - { os: dfly48, configs: pam } - { os: dfly58, configs: pam } From f2ff669347d320532e7c1b63cdf5c62f46e73150 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 28 Feb 2022 22:21:36 +1100 Subject: [PATCH 012/287] No unused param warnings for clang-12 and gcc-11. These have too many false positives in -Werror tests on the github CI since we often provide empty stub functions for functionality not needed for particular configurations. --- .github/configs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/configs b/.github/configs index 853da58a5..b3f421727 100755 --- a/.github/configs +++ b/.github/configs @@ -38,13 +38,13 @@ case "$config" in CC="clang-12" # clang's implicit-fallthrough requires that the code be annotated with # __attribute__((fallthrough)) and does not understand /* FALLTHROUGH */ - CFLAGS="-Wall -Wextra -O2 -Wno-error=implicit-fallthrough" + CFLAGS="-Wall -Wextra -O2 -Wno-error=implicit-fallthrough -Wno-error=unused-parameter" CONFIGFLAGS="--with-pam --with-Werror" ;; gcc-11-Werror) CC="gcc" # -Wnoformat-truncation in gcc 7.3.1 20180130 fails on fmt_scaled - CFLAGS="-Wall -Wextra -Wno-format-truncation -O2 -Wimplicit-fallthrough=4" + CFLAGS="-Wall -Wextra -O2 -Wno-format-truncation -Wimplicit-fallthrough=4 -Wno-unused-parameter" CONFIGFLAGS="--with-pam --with-Werror" ;; clang*|gcc*) From 15974235dd528aeab0ec67fb92a0a1d733f62be2 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 1 Mar 2022 09:00:20 +1100 Subject: [PATCH 013/287] Add OPENBSD ORIGINAL marker. --- openbsd-compat/chacha_private.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openbsd-compat/chacha_private.h b/openbsd-compat/chacha_private.h index 7c3680fa6..2e5c8c1da 100644 --- a/openbsd-compat/chacha_private.h +++ b/openbsd-compat/chacha_private.h @@ -1,3 +1,5 @@ +/* OPENBSD ORIGINAL: lib/libc/crypt/chacha_private.h */ + /* chacha-merged.c version 20080118 D. J. Bernstein From 6f117cb151efe138ac57bdd8e26165f350328f5f Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 1 Mar 2022 09:02:06 +1100 Subject: [PATCH 014/287] Remove unused ivbits argument from chacha_keysetup --- openbsd-compat/arc4random.c | 2 +- openbsd-compat/chacha_private.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index 80ff3c180..ce5f054f1 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -79,7 +79,7 @@ _rs_init(u_char *buf, size_t n) { if (n < KEYSZ + IVSZ) return; - chacha_keysetup(&rs, buf, KEYSZ * 8, 0); + chacha_keysetup(&rs, buf, KEYSZ * 8); chacha_ivsetup(&rs, buf + KEYSZ); } diff --git a/openbsd-compat/chacha_private.h b/openbsd-compat/chacha_private.h index 2e5c8c1da..cdcb78560 100644 --- a/openbsd-compat/chacha_private.h +++ b/openbsd-compat/chacha_private.h @@ -6,7 +6,7 @@ D. J. Bernstein Public domain. */ -/* $OpenBSD: chacha_private.h,v 1.2 2013/10/04 07:02:27 djm Exp $ */ +/* $OpenBSD: chacha_private.h,v 1.3 2022/02/28 21:56:29 dtucker Exp $ */ typedef unsigned char u8; typedef unsigned int u32; @@ -54,7 +54,7 @@ static const char sigma[16] = "expand 32-byte k"; static const char tau[16] = "expand 16-byte k"; static void -chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits,u32 ivbits) +chacha_keysetup(chacha_ctx *x,const u8 *k,u32 kbits) { const char *constants; From 4a66dac052c5ff5047161853f36904607649e4f9 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 25 Feb 2022 02:09:27 +0000 Subject: [PATCH 015/287] upstream: save an unneccessary alloc/free, based on patch from Martin Vahlensieck; ok dtucker@ OpenBSD-Commit-ID: 90ffbf1f837e509742f2c31a1fbf2c0fd376fd5f --- monitor.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/monitor.c b/monitor.c index c199cb9bc..20b9f67b9 100644 --- a/monitor.c +++ b/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.231 2022/01/28 06:18:42 guenther Exp $ */ +/* $OpenBSD: monitor.c,v 1.232 2022/02/25 02:09:27 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -709,7 +709,6 @@ mm_answer_sign(struct ssh *ssh, int sock, struct sshbuf *m) int mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m) { - char *username; struct passwd *pwent; int r, allowed = 0; u_int i; @@ -719,14 +718,12 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m) if (authctxt->attempt++ != 0) fatal_f("multiple attempts for getpwnam"); - if ((r = sshbuf_get_cstring(m, &username, NULL)) != 0) + if ((r = sshbuf_get_cstring(m, &authctxt->user, NULL)) != 0) fatal_fr(r, "parse"); - pwent = getpwnamallow(ssh, username); + pwent = getpwnamallow(ssh, authctxt->user); - authctxt->user = xstrdup(username); - setproctitle("%s [priv]", pwent ? username : "unknown"); - free(username); + setproctitle("%s [priv]", pwent ? authctxt->user : "unknown"); sshbuf_reset(m); From f2f3269423618a83157e18902385e720f9776007 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 25 Feb 2022 09:46:24 +0000 Subject: [PATCH 016/287] upstream: Remove the char * casts from arguments to do_lstat, do_readdir and do_stat paths since the underlying functions now take a const char *. Patch from vapier at gentoo.org. OpenBSD-Commit-ID: 9e4d964dbfb0ed683a2a2900711b88e7f1c0297b --- sftp-glob.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sftp-glob.c b/sftp-glob.c index f573f98f0..764e99552 100644 --- a/sftp-glob.c +++ b/sftp-glob.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-glob.c,v 1.29 2019/11/13 04:47:52 deraadt Exp $ */ +/* $OpenBSD: sftp-glob.c,v 1.30 2022/02/25 09:46:24 dtucker Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -51,7 +51,7 @@ fudge_opendir(const char *path) r = xcalloc(1, sizeof(*r)); - if (do_readdir(cur.conn, (char *)path, &r->dir)) { + if (do_readdir(cur.conn, path, &r->dir)) { free(r); return(NULL); } @@ -112,7 +112,7 @@ fudge_lstat(const char *path, struct stat *st) { Attrib *a; - if (!(a = do_lstat(cur.conn, (char *)path, 1))) + if (!(a = do_lstat(cur.conn, path, 1))) return(-1); attrib_to_stat(a, st); @@ -125,7 +125,7 @@ fudge_stat(const char *path, struct stat *st) { Attrib *a; - if (!(a = do_stat(cur.conn, (char *)path, 1))) + if (!(a = do_stat(cur.conn, path, 1))) return(-1); attrib_to_stat(a, st); From eceafbe0bdbbd9bd2f3cf024ccb350666a9934dd Mon Sep 17 00:00:00 2001 From: "naddy@openbsd.org" Date: Sun, 27 Feb 2022 01:33:59 +0000 Subject: [PATCH 017/287] upstream: include rejected signature algorithm in error message and not the (useless) key type; ok djm@ OpenBSD-Commit-ID: d0c0f552a4d9161203e07e95d58a76eb602a76ff --- auth2-pubkey.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/auth2-pubkey.c b/auth2-pubkey.c index 9c2298fc8..d297a5c3d 100644 --- a/auth2-pubkey.c +++ b/auth2-pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.112 2021/12/19 22:12:30 djm Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.113 2022/02/27 01:33:59 naddy Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -166,8 +166,8 @@ userauth_pubkey(struct ssh *ssh, const char *method) goto done; } if (match_pattern_list(pkalg, options.pubkey_accepted_algos, 0) != 1) { - logit_f("key type %s not in PubkeyAcceptedAlgorithms", - sshkey_ssh_name(key)); + logit_f("signature algorithm %s not in " + "PubkeyAcceptedAlgorithms", pkalg); goto done; } if ((r = sshkey_check_cert_sigtype(key, From 379b30120da53d7c84aa8299c26b18c51c2a0dac Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 1 Mar 2022 01:59:19 +0000 Subject: [PATCH 018/287] upstream: pack pollfd array before server_accept_loop() ppoll() call, and terminate sshd if ppoll() returns errno==EINVAL avoids spin in ppoll when MaxStartups > RLIMIT_NOFILE, reported by Daniel Micay feedback/ok deraadt OpenBSD-Commit-ID: dbab1c24993ac977ec24d83283b8b7528f7c2c15 --- sshd.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/sshd.c b/sshd.c index ef18ba467..30aeb8065 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.583 2022/02/01 07:57:32 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.584 2022/03/01 01:59:19 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1129,9 +1129,9 @@ static void server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) { struct pollfd *pfd = NULL; - int i, j, ret; + int i, j, ret, npfd; int ostartups = -1, startups = 0, listening = 0, lameduck = 0; - int startup_p[2] = { -1 , -1 }; + int startup_p[2] = { -1 , -1 }, *startup_pollfd; char c = 0; struct sockaddr_storage from; socklen_t fromlen; @@ -1142,6 +1142,7 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) /* pipes connected to unauthenticated child sshd processes */ startup_pipes = xcalloc(options.max_startups, sizeof(int)); startup_flags = xcalloc(options.max_startups, sizeof(int)); + startup_pollfd = xcalloc(options.max_startups, sizeof(int)); for (i = 0; i < options.max_startups; i++) startup_pipes[i] = -1; @@ -1157,6 +1158,7 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) sigaddset(&nsigset, SIGTERM); sigaddset(&nsigset, SIGQUIT); + /* sized for worst-case */ pfd = xcalloc(num_listen_socks + options.max_startups, sizeof(struct pollfd)); @@ -1196,24 +1198,31 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) pfd[i].fd = listen_socks[i]; pfd[i].events = POLLIN; } + npfd = num_listen_socks; for (i = 0; i < options.max_startups; i++) { - pfd[num_listen_socks+i].fd = startup_pipes[i]; - if (startup_pipes[i] != -1) - pfd[num_listen_socks+i].events = POLLIN; + startup_pollfd[i] = -1; + if (startup_pipes[i] != -1) { + pfd[npfd].fd = startup_pipes[i]; + pfd[npfd].events = POLLIN; + startup_pollfd[i] = npfd++; + } } /* Wait until a connection arrives or a child exits. */ - ret = ppoll(pfd, num_listen_socks + options.max_startups, - NULL, &osigset); - if (ret == -1 && errno != EINTR) + ret = ppoll(pfd, npfd, NULL, &osigset); + if (ret == -1 && errno != EINTR) { error("ppoll: %.100s", strerror(errno)); + if (errno == EINVAL) + cleanup_exit(1); /* can't recover */ + } sigprocmask(SIG_SETMASK, &osigset, NULL); if (ret == -1) continue; for (i = 0; i < options.max_startups; i++) { if (startup_pipes[i] == -1 || - !(pfd[num_listen_socks+i].revents & (POLLIN|POLLHUP))) + startup_pollfd[i] == -1 || + !(pfd[startup_pollfd[i]].revents & (POLLIN|POLLHUP))) continue; switch (read(startup_pipes[i], &c, sizeof(c))) { case -1: From 8cf5275452a950869cb90eeac7d220b01f77b12e Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 8 Mar 2022 20:04:06 +1100 Subject: [PATCH 019/287] Default to not using sandbox when cross compiling. On most systems poll(2) does not work when the number of FDs is reduced with setrlimit, so assume it doesn't when cross compiling and we can't run the test. bz#3398. --- configure.ac | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 17fb1e609..a165d0879 100644 --- a/configure.ac +++ b/configure.ac @@ -3574,8 +3574,8 @@ AC_RUN_IFELSE( select_works_with_rlimit=yes], [AC_MSG_RESULT([no]) select_works_with_rlimit=no], - [AC_MSG_WARN([cross compiling: assuming yes]) - select_works_with_rlimit=yes] + [AC_MSG_WARN([cross compiling: assuming no]) + select_works_with_rlimit=no] ) AC_CHECK_MEMBERS([struct pollfd.fd], [], [], [[ From c41c84b439f4cd74d4fe44298a4b4037ddd7d2ae Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 9 Mar 2022 09:29:30 +1100 Subject: [PATCH 020/287] Check for missing ftruncate prototype. From github PR#301 in conjunction with rsbeckerca. --- configure.ac | 6 ++++++ openbsd-compat/openbsd-compat.h | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/configure.ac b/configure.ac index a165d0879..41761c5b9 100644 --- a/configure.ac +++ b/configure.ac @@ -2092,6 +2092,12 @@ AC_CHECK_DECLS([O_NONBLOCK], , , #endif ]) +AC_CHECK_DECLS([ftruncate], , , + [ +#include +#include + ]) + AC_CHECK_DECLS([readv, writev], , , [ #include #include diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index c202e1429..0cecfb621 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -65,6 +65,10 @@ int bindresvport_sa(int sd, struct sockaddr *sa); void closefrom(int); #endif +#if defined(HAVE_DECL_FTRUNCATE) && HAVE_DECL_FTRUNCATE == 0 +int ftruncate(int filedes, off_t length); +#endif + #ifndef HAVE_GETLINE #include ssize_t getline(char **, size_t *, FILE *); From 5ae31a0fdd27855af29f48ff027491629fff5979 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 9 Mar 2022 09:41:56 +1100 Subject: [PATCH 021/287] Provide killpg implementation. Based on github PR#301 for Tandem NonStop. --- configure.ac | 1 + openbsd-compat/bsd-misc.c | 8 ++++++++ openbsd-compat/openbsd-compat.h | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/configure.ac b/configure.ac index 41761c5b9..42fd890b9 100644 --- a/configure.ac +++ b/configure.ac @@ -1876,6 +1876,7 @@ AC_CHECK_FUNCS([ \ inet_ntoa \ inet_ntop \ innetgr \ + killpg \ llabs \ localtime_r \ login_getcapbool \ diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c index d9c9b2671..3b00ef6d2 100644 --- a/openbsd-compat/bsd-misc.c +++ b/openbsd-compat/bsd-misc.c @@ -412,6 +412,14 @@ getsid(pid_t pid) } #endif +#ifndef HAVE_KILLPG +int +killpg(pid_t pgrp, int sig) +{ + return kill(pgrp, sig); +} +#endif + #ifdef FFLUSH_NULL_BUG #undef fflush int _ssh_compat_fflush(FILE *f) diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index 0cecfb621..4316ab84b 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -82,6 +82,10 @@ int getpagesize(void); char *getcwd(char *pt, size_t size); #endif +#ifndef HAVE_KILLPG +int killpg(pid_t, int); +#endif + #if defined(HAVE_DECL_MEMMEM) && HAVE_DECL_MEMMEM == 0 void *memmem(const void *, size_t, const void *, size_t); #endif From 2893c5e764557f48f9d6a929e224ed49c59545db Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 11 Mar 2022 18:43:58 +1100 Subject: [PATCH 022/287] Resync fmt_scaled. with OpenBSD. Fixes underflow reported in bz#3401. --- openbsd-compat/fmt_scaled.c | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/openbsd-compat/fmt_scaled.c b/openbsd-compat/fmt_scaled.c index 2f76ef931..87d40d2d3 100644 --- a/openbsd-compat/fmt_scaled.c +++ b/openbsd-compat/fmt_scaled.c @@ -1,4 +1,4 @@ -/* $OpenBSD: fmt_scaled.c,v 1.17 2018/05/14 04:39:04 djm Exp $ */ +/* $OpenBSD: fmt_scaled.c,v 1.21 2022/03/11 07:29:53 dtucker Exp $ */ /* * Copyright (c) 2001, 2002, 2003 Ian F. Darwin. All rights reserved. @@ -54,9 +54,9 @@ typedef enum { } unit_type; /* These three arrays MUST be in sync! XXX make a struct */ -static unit_type units[] = { NONE, KILO, MEGA, GIGA, TERA, PETA, EXA }; -static char scale_chars[] = "BKMGTPE"; -static long long scale_factors[] = { +static const unit_type units[] = { NONE, KILO, MEGA, GIGA, TERA, PETA, EXA }; +static const char scale_chars[] = "BKMGTPE"; +static const long long scale_factors[] = { 1LL, 1024LL, 1024LL*1024, @@ -153,10 +153,8 @@ scan_scaled(char *scaled, long long *result) } } - if (sign) { + if (sign) whole *= sign; - fpart *= sign; - } /* If no scale factor given, we're done. fraction is discarded. */ if (!*p) { @@ -191,7 +189,8 @@ scan_scaled(char *scaled, long long *result) /* truncate fpart so it doesn't overflow. * then scale fractional part. */ - while (fpart >= LLONG_MAX / scale_fact) { + while (fpart >= LLONG_MAX / scale_fact || + fpart <= LLONG_MIN / scale_fact) { fpart /= 10; fract_digits--; } @@ -200,7 +199,10 @@ scan_scaled(char *scaled, long long *result) for (i = 0; i < fract_digits -1; i++) fpart /= 10; } - whole += fpart; + if (sign == -1) + whole -= fpart; + else + whole += fpart; *result = whole; return 0; } @@ -222,12 +224,16 @@ fmt_scaled(long long number, char *result) unsigned int i; unit_type unit = NONE; + /* Not every negative long long has a positive representation. */ + if (number == LLONG_MIN) { + errno = ERANGE; + return -1; + } + abval = llabs(number); - /* Not every negative long long has a positive representation. - * Also check for numbers that are just too darned big to format - */ - if (abval < 0 || abval / 1024 >= scale_factors[SCALE_LENGTH-1]) { + /* Also check for numbers that are just too darned big to format. */ + if (abval / 1024 >= scale_factors[SCALE_LENGTH-1]) { errno = ERANGE; return -1; } From ce324cf58ba2840e31afeb996935800780c8fa4b Mon Sep 17 00:00:00 2001 From: "cheloha@openbsd.org" Date: Sun, 13 Mar 2022 23:27:54 +0000 Subject: [PATCH 023/287] upstream: ssh: xstrdup(): use memcpy(3) Copying the given string into the buffer with strlcpy(3) confers no benefit in this context because we have already determined the string's length with strlen(3) in order to allocate that buffer. Thread: https://marc.info/?l=openbsd-tech&m=164687525802691&w=2 ok dtucker@ millert@ OpenBSD-Commit-ID: f8bfc082e36e2d2dc4e1feece02fe274155ca11a --- xmalloc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/xmalloc.c b/xmalloc.c index b48d33bbf..67191e3f2 100644 --- a/xmalloc.c +++ b/xmalloc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xmalloc.c,v 1.36 2019/11/12 22:32:48 djm Exp $ */ +/* $OpenBSD: xmalloc.c,v 1.37 2022/03/13 23:27:54 cheloha Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -91,8 +91,7 @@ xstrdup(const char *str) len = strlen(str) + 1; cp = xmalloc(len); - strlcpy(cp, str, len); - return cp; + return memcpy(cp, str, len); } int From 5a252d54a63be30d5ba4be76210942d754a531c0 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Tue, 15 Mar 2022 05:27:37 +0000 Subject: [PATCH 024/287] upstream: improve DEBUG_CHANNEL_POLL debugging message OpenBSD-Commit-ID: 2275eb7bc4707d019b1a0194b9c92c0b78da848f --- channels.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/channels.c b/channels.c index 73e93c032..1137259af 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.413 2022/02/17 10:58:27 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.414 2022/03/15 05:27:37 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2475,10 +2475,10 @@ dump_channel_poll(const char *func, const char *what, Channel *c, u_int pollfd_offset, struct pollfd *pfd) { #ifdef DEBUG_CHANNEL_POLL - debug3_f("channel %d: rfd r%d w%d e%d s%d " - "pfd[%u].fd=%d want 0x%02x ev 0x%02x ready 0x%02x rev 0x%02x", - c->self, c->rfd, c->wfd, c->efd, c->sock, pollfd_offset, pfd->fd, - c->io_want, pfd->events, c->io_ready, pfd->revents); + debug3("%s: channel %d: rfd r%d w%d e%d s%d pfd[%u].fd=%d " + "io_want 0x%02x pfd.ev 0x%02x io_ready 0x%02x pfd.rev 0x%02x", + func, c->self, c->rfd, c->wfd, c->efd, c->sock, pollfd_offset, + pfd->fd, c->io_want, pfd->events, c->io_ready, pfd->revents); #endif } From a0b5816f8f1f645acdf74f7bc11b34455ec30bac Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 18 Mar 2022 02:31:25 +0000 Subject: [PATCH 025/287] upstream: ssh-keygen -Y check-novalidate requires namespace or SEGV will ensue. Patch from Mateusz Adamowski via GHPR#307 OpenBSD-Commit-ID: 99e8ec38f9feb38bce6de240335be34aedeba5fd --- ssh-keygen.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index d4b7f4dcf..34c316d25 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.448 2022/02/01 23:32:51 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.449 2022/03/18 02:31:25 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3538,6 +3538,12 @@ main(int argc, char **argv) return sig_sign(identity_file, cert_principals, argc, argv, opts, nopts); } else if (strncmp(sign_op, "check-novalidate", 16) == 0) { + if (cert_principals == NULL || + *cert_principals == '\0') { + error("Too few arguments for check-novalidate: " + "missing namespace"); + exit(1); + } if (ca_key_path == NULL) { error("Too few arguments for check-novalidate: " "missing signature file"); From 807be68684da7a1fe969c399ddce2fafb7997dcb Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 18 Mar 2022 02:32:22 +0000 Subject: [PATCH 026/287] upstream: helpful comment OpenBSD-Commit-ID: e3315a45cb04e7feeb614d76ec80a9fe4ca0e8c7 --- ssh-keygen.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index 34c316d25..d62fab3e8 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.449 2022/03/18 02:31:25 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.450 2022/03/18 02:32:22 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3538,6 +3538,7 @@ main(int argc, char **argv) return sig_sign(identity_file, cert_principals, argc, argv, opts, nopts); } else if (strncmp(sign_op, "check-novalidate", 16) == 0) { + /* NB. cert_principals is actually namespace, via -n */ if (cert_principals == NULL || *cert_principals == '\0') { error("Too few arguments for check-novalidate: " From 1c83c082128694ddd11ac05fdf31d70312ff1763 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 18 Mar 2022 02:50:21 +0000 Subject: [PATCH 027/287] upstream: remove blank line OpenBSD-Commit-ID: d5e0182965b2fbfb03ad5f256d1a1ce5706bcddf --- sftp.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sftp.c b/sftp.c index 8cb5917a9..01e0afefa 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.212 2021/09/11 09:05:50 schwarze Exp $ */ +/* $OpenBSD: sftp.c,v 1.213 2022/03/18 02:50:21 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -2272,7 +2272,6 @@ static void connect_to_server(char *path, char **args, int *in, int *out) { int c_in, c_out; - #ifdef USE_PIPES int pin[2], pout[2]; From 731087d2619fa7f01e675b23f57af10d745e8af2 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 18 Mar 2022 04:04:11 +0000 Subject: [PATCH 028/287] upstream: don't try to resolve ListenAddress directives in the sshd re-exec path - we're never going to use the result and if the operation fails then it can prevent connections from being accepted. Reported by Aaron Poffenberger; with / ok dtucker@ OpenBSD-Commit-ID: 44c53a43909a328e2f5ab26070fdef3594eded60 --- servconf.c | 9 +++++---- servconf.h | 4 ++-- sshd.c | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/servconf.c b/servconf.c index 903169621..9d9681f15 100644 --- a/servconf.c +++ b/servconf.c @@ -1,5 +1,5 @@ -/* $OpenBSD: servconf.c,v 1.383 2022/02/08 08:59:12 dtucker Exp $ */ +/* $OpenBSD: servconf.c,v 1.384 2022/03/18 04:04:11 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -2520,7 +2520,7 @@ parse_server_match_config(ServerOptions *options, initialize_server_options(&mo); parse_server_config(&mo, "reprocess config", cfg, includes, - connectinfo); + connectinfo, 0); copy_set_server_options(options, &mo, 0); } @@ -2698,12 +2698,13 @@ parse_server_config_depth(ServerOptions *options, const char *filename, void parse_server_config(ServerOptions *options, const char *filename, struct sshbuf *conf, struct include_list *includes, - struct connection_info *connectinfo) + struct connection_info *connectinfo, int reexec) { int active = connectinfo ? 0 : 1; parse_server_config_depth(options, filename, conf, includes, connectinfo, (connectinfo ? SSHCFG_MATCH_ONLY : 0), &active, 0); - process_queued_listen_addrs(options); + if (!reexec) + process_queued_listen_addrs(options); } static const char * diff --git a/servconf.h b/servconf.h index dd5cbc15c..8a04463e0 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.155 2021/07/02 05:11:21 dtucker Exp $ */ +/* $OpenBSD: servconf.h,v 1.156 2022/03/18 04:04:11 djm Exp $ */ /* * Author: Tatu Ylonen @@ -297,7 +297,7 @@ int process_server_config_line(ServerOptions *, char *, const char *, int, void process_permitopen(struct ssh *ssh, ServerOptions *options); void load_server_config(const char *, struct sshbuf *); void parse_server_config(ServerOptions *, const char *, struct sshbuf *, - struct include_list *includes, struct connection_info *); + struct include_list *includes, struct connection_info *, int); void parse_server_match_config(ServerOptions *, struct include_list *includes, struct connection_info *); int parse_server_match_testspec(struct connection_info *, char *); diff --git a/sshd.c b/sshd.c index 30aeb8065..0ee65b54b 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.584 2022/03/01 01:59:19 djm Exp $ */ +/* $OpenBSD: sshd.c,v 1.585 2022/03/18 04:04:11 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1749,7 +1749,7 @@ main(int ac, char **av) load_server_config(config_file_name, cfg); parse_server_config(&options, rexeced_flag ? "rexec" : config_file_name, - cfg, &includes, NULL); + cfg, &includes, NULL, rexeced_flag); #ifdef WITH_OPENSSL if (options.moduli_file != NULL) From a72bde294fe0518c9a44ba63864093a1ef2425e3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 20 Mar 2022 08:51:21 +0000 Subject: [PATCH 029/287] upstream: make addargs() and replacearg() a little more robust and improve error reporting make freeargs(NULL) a noop like the other free functions ok dtucker as part of bz3403 OpenBSD-Commit-ID: 15f86da83176978b4d1d288caa24c766dfa2983d --- misc.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/misc.c b/misc.c index 417498deb..85d223695 100644 --- a/misc.c +++ b/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.174 2022/02/11 00:43:56 dtucker Exp $ */ +/* $OpenBSD: misc.c,v 1.175 2022/03/20 08:51:21 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -1069,16 +1069,21 @@ addargs(arglist *args, char *fmt, ...) r = vasprintf(&cp, fmt, ap); va_end(ap); if (r == -1) - fatal("addargs: argument too long"); + fatal_f("argument too long"); nalloc = args->nalloc; if (args->list == NULL) { nalloc = 32; args->num = 0; - } else if (args->num+2 >= nalloc) + } else if (args->num > (256 * 1024)) + fatal_f("too many arguments"); + else if (args->num >= args->nalloc) + fatal_f("arglist corrupt"); + else if (args->num+2 >= nalloc) nalloc *= 2; - args->list = xrecallocarray(args->list, args->nalloc, nalloc, sizeof(char *)); + args->list = xrecallocarray(args->list, args->nalloc, + nalloc, sizeof(char *)); args->nalloc = nalloc; args->list[args->num++] = cp; args->list[args->num] = NULL; @@ -1095,10 +1100,12 @@ replacearg(arglist *args, u_int which, char *fmt, ...) r = vasprintf(&cp, fmt, ap); va_end(ap); if (r == -1) - fatal("replacearg: argument too long"); + fatal_f("argument too long"); + if (args->list == NULL || args->num >= args->nalloc) + fatal_f("arglist corrupt"); if (which >= args->num) - fatal("replacearg: tried to replace invalid arg %d >= %d", + fatal_f("tried to replace invalid arg %d >= %d", which, args->num); free(args->list[which]); args->list[which] = cp; @@ -1109,13 +1116,15 @@ freeargs(arglist *args) { u_int i; - if (args->list != NULL) { + if (args == NULL) + return; + if (args->list != NULL && args->num < args->nalloc) { for (i = 0; i < args->num; i++) free(args->list[i]); free(args->list); - args->nalloc = args->num = 0; - args->list = NULL; } + args->nalloc = args->num = 0; + args->list = NULL; } /* From 16ea8b85838dd7a4dbeba4e51ac4f43fd68b1e5b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 20 Mar 2022 08:52:17 +0000 Subject: [PATCH 030/287] upstream: don't leak argument list; bz3404, reported by Balu Gajjala ok dtucker@ OpenBSD-Commit-ID: fddc32d74e5dd5cff1a49ddd6297b0867eae56a6 --- scp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scp.c b/scp.c index 04f1a649b..c36d66aa5 100644 --- a/scp.c +++ b/scp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.246 2022/02/23 19:01:00 deraadt Exp $ */ +/* $OpenBSD: scp.c,v 1.247 2022/03/20 08:52:17 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -968,7 +968,7 @@ do_sftp_connect(char *host, char *user, int port, char *sftp_direct, return NULL; } else { - args.list = NULL; + freeargs(&args); addargs(&args, "sftp-server"); if (do_cmd(sftp_direct, host, NULL, -1, 0, "sftp", reminp, remoutp, pidp) < 0) From d23efe4b12886ffe416be10bc0a7da6ca8aa72d1 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 08:13:46 +1100 Subject: [PATCH 031/287] Add OpenWRT mips and mipsel test targets. --- .github/configs | 4 ++++ .github/workflows/selfhosted.yml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/.github/configs b/.github/configs index b3f421727..69ef9bbb7 100755 --- a/.github/configs +++ b/.github/configs @@ -173,6 +173,10 @@ case "${TARGET_HOST}" in # SHA256 functions in sha2.h conflict with OpenSSL's breaking sk-dummy CONFIGFLAGS="${CONFIGFLAGS} --without-hardening --disable-security-key" ;; + openwrt-*) + CONFIGFLAGS="${CONFIGFLAGS} --without-openssl --without-zlib" + TEST_TARGET="t-exec" + ;; sol10|sol11) # sol10 VM is 32bit and the unit tests are slow. # sol11 has 4 test configs so skip unit tests to speed up. diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 6b2cbd737..38bbcff77 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -41,6 +41,8 @@ jobs: - obsd70 - obsdsnap - openindiana + - openwrt-mips + - openwrt-mipsel # - rocky84 - sol10 - sol11 From 2923d026e55998133c0f6e5186dca2a3c0fa5ff5 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 12:49:50 +1100 Subject: [PATCH 032/287] Factor out platform-specific locked account check. Also fixes an incorrect free on platforms with both libiaf and shadow passwords (probably only Unixware). Prompted by github PR#284, originally from @c3h2_ctf and stoeckmann@. --- auth.c | 50 +++----------------------------------------------- platform.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ platform.h | 1 + 3 files changed, 55 insertions(+), 47 deletions(-) diff --git a/auth.c b/auth.c index 560e8ecac..81d275895 100644 --- a/auth.c +++ b/auth.c @@ -104,59 +104,15 @@ allowed_user(struct ssh *ssh, struct passwd * pw) const char *hostname = NULL, *ipaddr = NULL, *passwd = NULL; u_int i; int r; -#ifdef USE_SHADOW - struct spwd *spw = NULL; -#endif /* Shouldn't be called if pw is NULL, but better safe than sorry... */ if (!pw || !pw->pw_name) return 0; -#ifdef USE_SHADOW - if (!options.use_pam) - spw = getspnam(pw->pw_name); -#ifdef HAS_SHADOW_EXPIRE - if (!options.use_pam && spw != NULL && auth_shadow_acctexpired(spw)) + if (!options.use_pam && platform_locked_account(pw)) { + logit("User %.100s not allowed because account is locked", + pw->pw_name); return 0; -#endif /* HAS_SHADOW_EXPIRE */ -#endif /* USE_SHADOW */ - - /* grab passwd field for locked account check */ - passwd = pw->pw_passwd; -#ifdef USE_SHADOW - if (spw != NULL) -#ifdef USE_LIBIAF - passwd = get_iaf_password(pw); -#else - passwd = spw->sp_pwdp; -#endif /* USE_LIBIAF */ -#endif - - /* check for locked account */ - if (!options.use_pam && passwd && *passwd) { - int locked = 0; - -#ifdef LOCKED_PASSWD_STRING - if (strcmp(passwd, LOCKED_PASSWD_STRING) == 0) - locked = 1; -#endif -#ifdef LOCKED_PASSWD_PREFIX - if (strncmp(passwd, LOCKED_PASSWD_PREFIX, - strlen(LOCKED_PASSWD_PREFIX)) == 0) - locked = 1; -#endif -#ifdef LOCKED_PASSWD_SUBSTR - if (strstr(passwd, LOCKED_PASSWD_SUBSTR)) - locked = 1; -#endif -#ifdef USE_LIBIAF - free((void *) passwd); -#endif /* USE_LIBIAF */ - if (locked) { - logit("User %.100s not allowed because account is locked", - pw->pw_name); - return 0; - } } /* diff --git a/platform.c b/platform.c index 44ba71dc5..4fe8744ee 100644 --- a/platform.c +++ b/platform.c @@ -18,6 +18,7 @@ #include #include +#include #include #include "log.h" @@ -197,3 +198,53 @@ platform_krb5_get_principal_name(const char *pw_name) return NULL; #endif } + +/* returns 1 if account is locked */ +int +platform_locked_account(struct passwd *pw) +{ + int locked = 0; + char *passwd = pw->pw_passwd; +#ifdef USE_SHADOW + struct spwd *spw = NULL; +#ifdef USE_LIBIAF + char *iaf_passwd = NULL; +#endif + + spw = getspnam(pw->pw_name); +#ifdef HAS_SHADOW_EXPIRE + if (spw != NULL && auth_shadow_acctexpired(spw)) + return 1; +#endif /* HAS_SHADOW_EXPIRE */ + + if (spw != NULL) +#ifdef USE_LIBIAF + iaf_passwd = passwd = get_iaf_password(pw); +#else + passwd = spw->sp_pwdp; +#endif /* USE_LIBIAF */ +#endif + + /* check for locked account */ + if (passwd && *passwd) { +#ifdef LOCKED_PASSWD_STRING + if (strcmp(passwd, LOCKED_PASSWD_STRING) == 0) + locked = 1; +#endif +#ifdef LOCKED_PASSWD_PREFIX + if (strncmp(passwd, LOCKED_PASSWD_PREFIX, + strlen(LOCKED_PASSWD_PREFIX)) == 0) + locked = 1; +#endif +#ifdef LOCKED_PASSWD_SUBSTR + if (strstr(passwd, LOCKED_PASSWD_SUBSTR)) + locked = 1; +#endif + } +#ifdef USE_LIBIAF + if (iaf_passwd != NULL) + freezero(iaf_passwd, strlen(iaf_passwd)); +#endif /* USE_LIBIAF */ + + return locked; +} diff --git a/platform.h b/platform.h index ea4f9c584..98c48da40 100644 --- a/platform.h +++ b/platform.h @@ -28,6 +28,7 @@ void platform_setusercontext(struct passwd *); void platform_setusercontext_post_groups(struct passwd *); char *platform_get_krb5_client(const char *); char *platform_krb5_get_principal_name(const char *); +int platform_locked_account(struct passwd *) int platform_sys_dir_uid(uid_t); void platform_disable_tracing(int); From 5b467ceef2c356f0a77f5e8ab4eb0fac367e4d24 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 13:15:44 +1100 Subject: [PATCH 033/287] Missing semicolon. --- platform.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.h b/platform.h index 98c48da40..7fef8c983 100644 --- a/platform.h +++ b/platform.h @@ -28,7 +28,7 @@ void platform_setusercontext(struct passwd *); void platform_setusercontext_post_groups(struct passwd *); char *platform_get_krb5_client(const char *); char *platform_krb5_get_principal_name(const char *); -int platform_locked_account(struct passwd *) +int platform_locked_account(struct passwd *); int platform_sys_dir_uid(uid_t); void platform_disable_tracing(int); From 24dc37d198f35a7cf71bf4d5384363c7ef4209d4 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 15:02:45 +1100 Subject: [PATCH 034/287] Remove now-unused passwd variable. --- auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/auth.c b/auth.c index 81d275895..58754c070 100644 --- a/auth.c +++ b/auth.c @@ -101,7 +101,7 @@ int allowed_user(struct ssh *ssh, struct passwd * pw) { struct stat st; - const char *hostname = NULL, *ipaddr = NULL, *passwd = NULL; + const char *hostname = NULL, *ipaddr = NULL; u_int i; int r; From f5cdd3b3c275dffaebfca91df782dca29975e9ac Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 16:28:04 +1100 Subject: [PATCH 035/287] Use tarballs when testing LibreSSL releases. This means they'll still work when the combination of -portable and openbsd github repos no longer match. --- .github/setup_ci.sh | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index ca37f8c55..a565d6b7e 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -122,11 +122,20 @@ if [ ! -z "${INSTALL_OPENSSL}" ]; then fi if [ ! -z "${INSTALL_LIBRESSL}" ]; then - (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && - git clone https://github.com/libressl-portable/portable.git && - cd ${HOME}/libressl/portable && - git checkout ${INSTALL_LIBRESSL} && - sh update.sh && sh autogen.sh && - ./configure --prefix=/opt/libressl && - make -j2 && sudo make install) + if [ "${INSTALL_LIBRESSL}" = "master" ]; then + (mkdir -p ${HOME}/libressl && cd ${HOME}/libressl && + git clone https://github.com/libressl-portable/portable.git && + cd ${HOME}/libressl/portable && + git checkout ${INSTALL_LIBRESSL} && + sh update.sh && sh autogen.sh && + ./configure --prefix=/opt/libressl && + make -j2 && sudo make install) + else + LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/ + (cd ${HOME} && + wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && + tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && + cd libressl-${INSTALL_LIBRESSL} && + ./configure --prefix=/opt/libressl && make -j2 && sudo make install) + fi fi From 4bbe815ba974b4fd89cc3fc3e3ef1be847a0befe Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 26 Mar 2022 22:01:31 +1100 Subject: [PATCH 036/287] Drop leading "v" from release version identifier. It's present in the git tags but not in the release tarball names. Also drop extra "/" from URL path. --- .github/setup_ci.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index a565d6b7e..a3bb8587e 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -80,7 +80,7 @@ for TARGET in $TARGETS; do INSTALL_LIBRESSL=$(echo ${TARGET} | cut -f2 -d-) case ${INSTALL_LIBRESSL} in master) ;; - *) INSTALL_LIBRESSL="v$(echo ${TARGET} | cut -f2 -d-)" ;; + *) INSTALL_LIBRESSL="$(echo ${TARGET} | cut -f2 -d-)" ;; esac PACKAGES="${PACKAGES} putty-tools" ;; @@ -131,7 +131,7 @@ if [ ! -z "${INSTALL_LIBRESSL}" ]; then ./configure --prefix=/opt/libressl && make -j2 && sudo make install) else - LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL/ + LIBRESSL_URLBASE=https://cdn.openbsd.org/pub/OpenBSD/LibreSSL (cd ${HOME} && wget ${LIBRESSL_URLBASE}/libressl-${INSTALL_LIBRESSL}.tar.gz && tar xfz libressl-${INSTALL_LIBRESSL}.tar.gz && From e937514920335b92b543fd9be79cd6481d1eb0b6 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 28 Mar 2022 17:51:03 +1100 Subject: [PATCH 037/287] Add AIX 5.1 test target. --- .github/workflows/selfhosted.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 38bbcff77..e8ce6ac40 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -16,6 +16,7 @@ jobs: # default config. "os" corresponds to a label associated with the worker. matrix: os: + - aix51 - ARM64 - alpine - bbone From 6d4fc51adb9d8a42f67b5474f02f877422379de6 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 30 Mar 2022 04:27:51 +0000 Subject: [PATCH 038/287] upstream: avoid NULL deref via ssh-keygen -Y find-principals. bz3409, reported by Mateusz Adamowski OpenBSD-Commit-ID: a3b2c02438052ee858e0ee18e5a288586b5df2c5 --- sshsig.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/sshsig.c b/sshsig.c index 773613462..1e3b63982 100644 --- a/sshsig.c +++ b/sshsig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshsig.c,v 1.28 2022/02/01 23:34:47 djm Exp $ */ +/* $OpenBSD: sshsig.c,v 1.29 2022/03/30 04:27:51 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -739,7 +739,7 @@ parse_principals_key_and_options(const char *path, u_long linenum, char *line, return SSH_ERR_KEY_NOT_FOUND; /* blank or all-comment line */ /* format: identity[,identity...] [option[,option...]] key */ - if ((tmp = strdelimw(&cp)) == NULL) { + if ((tmp = strdelimw(&cp)) == NULL || cp == NULL) { error("%s:%lu: invalid line", path, linenum); r = SSH_ERR_INVALID_FORMAT; goto out; @@ -777,6 +777,11 @@ parse_principals_key_and_options(const char *path, u_long linenum, char *line, r = SSH_ERR_INVALID_FORMAT; goto out; } + if (cp == NULL || *cp == '\0') { + error("%s:%lu: missing key", path, linenum); + r = SSH_ERR_INVALID_FORMAT; + goto out; + } *cp++ = '\0'; skip_space(&cp); if (sshkey_read(key, &cp) != 0) { From 8a74a96d25ca4d32fbf298f6c0ac5a148501777d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 30 Mar 2022 04:33:09 +0000 Subject: [PATCH 039/287] upstream: ssh is almost out of getopt() characters; note the remaining remaining available ones in a comment OpenBSD-Commit-ID: 48d38cef59d6bc8e84c6c066f6d601875d3253fd --- ssh.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ssh.c b/ssh.c index 8ff978818..89ca1940c 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.573 2022/02/08 08:59:12 dtucker Exp $ */ +/* $OpenBSD: ssh.c,v 1.574 2022/03/30 04:33:09 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -696,7 +696,7 @@ main(int ac, char **av) again: while ((opt = getopt(ac, av, "1246ab:c:e:fgi:kl:m:no:p:qstvx" - "AB:CD:E:F:GI:J:KL:MNO:PQ:R:S:TVw:W:XYy")) != -1) { + "AB:CD:E:F:GI:J:KL:MNO:PQ:R:S:TVw:W:XYy")) != -1) { /* HUZdhjruz */ switch (opt) { case '1': fatal("SSH protocol v.1 is no longer supported"); From d6556de1db0822c76ba2745cf5c097d9472adf7c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 30 Mar 2022 21:10:25 +0000 Subject: [PATCH 040/287] upstream: fix poll() spin when a channel's output fd closes without data in the channel buffer. Introduce more exact packing of channel fds into the pollfd array. fixes bz3405 and bz3411; ok deraadt@ markus@ OpenBSD-Commit-ID: 06740737849c9047785622ad5d472cb6a3907d10 --- channels.c | 218 ++++++++++++++++++++++++++++------------------------- channels.h | 4 +- 2 files changed, 118 insertions(+), 104 deletions(-) diff --git a/channels.c b/channels.c index 1137259af..ee3c78792 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.414 2022/03/15 05:27:37 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.415 2022/03/30 21:10:25 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -432,21 +432,25 @@ channel_close_fd(struct ssh *ssh, Channel *c, int *fdp) c->io_want &= ~SSH_CHAN_IO_RFD; c->io_ready &= ~SSH_CHAN_IO_RFD; c->rfd = -1; + c->pfds[0] = -1; } if (*fdp == c->wfd) { c->io_want &= ~SSH_CHAN_IO_WFD; c->io_ready &= ~SSH_CHAN_IO_WFD; c->wfd = -1; + c->pfds[1] = -1; } if (*fdp == c->efd) { c->io_want &= ~SSH_CHAN_IO_EFD; c->io_ready &= ~SSH_CHAN_IO_EFD; c->efd = -1; + c->pfds[2] = -1; } if (*fdp == c->sock) { c->io_want &= ~SSH_CHAN_IO_SOCK; c->io_ready &= ~SSH_CHAN_IO_SOCK; c->sock = -1; + c->pfds[3] = -1; } ret = close(fd); @@ -2475,10 +2479,13 @@ dump_channel_poll(const char *func, const char *what, Channel *c, u_int pollfd_offset, struct pollfd *pfd) { #ifdef DEBUG_CHANNEL_POLL - debug3("%s: channel %d: rfd r%d w%d e%d s%d pfd[%u].fd=%d " - "io_want 0x%02x pfd.ev 0x%02x io_ready 0x%02x pfd.rev 0x%02x", - func, c->self, c->rfd, c->wfd, c->efd, c->sock, pollfd_offset, - pfd->fd, c->io_want, pfd->events, c->io_ready, pfd->revents); + debug3("%s: channel %d: %s r%d w%d e%d s%d c->pfds [ %d %d %d %d ] " + "io_want 0x%02x io_ready 0x%02x pfd[%u].fd=%d " + "pfd.ev 0x%02x pfd.rev 0x%02x", func, c->self, what, + c->rfd, c->wfd, c->efd, c->sock, + c->pfds[0], c->pfds[1], c->pfds[2], c->pfds[3], + c->io_want, c->io_ready, + pollfd_offset, pfd->fd, pfd->events, pfd->revents); #endif } @@ -2487,7 +2494,7 @@ static void channel_prepare_pollfd(Channel *c, u_int *next_pollfd, struct pollfd *pfd, u_int npfd) { - u_int p = *next_pollfd; + u_int ev, p = *next_pollfd; if (c == NULL) return; @@ -2496,7 +2503,7 @@ channel_prepare_pollfd(Channel *c, u_int *next_pollfd, fatal_f("channel %d: bad pfd offset %u (max %u)", c->self, p, npfd); } - c->pollfd_offset = -1; + c->pfds[0] = c->pfds[1] = c->pfds[2] = c->pfds[3] = -1; /* * prepare c->rfd * @@ -2505,69 +2512,82 @@ channel_prepare_pollfd(Channel *c, u_int *next_pollfd, * IO too. */ if (c->rfd != -1) { - if (c->pollfd_offset == -1) - c->pollfd_offset = p; - pfd[p].fd = c->rfd; - pfd[p].events = 0; + ev = 0; if ((c->io_want & SSH_CHAN_IO_RFD) != 0) - pfd[p].events |= POLLIN; + ev |= POLLIN; /* rfd == wfd */ - if (c->wfd == c->rfd && - (c->io_want & SSH_CHAN_IO_WFD) != 0) - pfd[p].events |= POLLOUT; + if (c->wfd == c->rfd) { + if ((c->io_want & SSH_CHAN_IO_WFD) != 0) + ev |= POLLOUT; + } /* rfd == efd */ - if (c->efd == c->rfd && - (c->io_want & SSH_CHAN_IO_EFD_R) != 0) - pfd[p].events |= POLLIN; - if (c->efd == c->rfd && - (c->io_want & SSH_CHAN_IO_EFD_W) != 0) - pfd[p].events |= POLLOUT; + if (c->efd == c->rfd) { + if ((c->io_want & SSH_CHAN_IO_EFD_R) != 0) + ev |= POLLIN; + if ((c->io_want & SSH_CHAN_IO_EFD_W) != 0) + ev |= POLLOUT; + } /* rfd == sock */ - if (c->sock == c->rfd && - (c->io_want & SSH_CHAN_IO_SOCK_R) != 0) - pfd[p].events |= POLLIN; - if (c->sock == c->rfd && - (c->io_want & SSH_CHAN_IO_SOCK_W) != 0) - pfd[p].events |= POLLOUT; - dump_channel_poll(__func__, "rfd", c, p, &pfd[p]); - p++; + if (c->sock == c->rfd) { + if ((c->io_want & SSH_CHAN_IO_SOCK_R) != 0) + ev |= POLLIN; + if ((c->io_want & SSH_CHAN_IO_SOCK_W) != 0) + ev |= POLLOUT; + } + /* Pack a pfd entry if any event armed for this fd */ + if (ev != 0) { + c->pfds[0] = p; + pfd[p].fd = c->rfd; + pfd[p].events = ev; + dump_channel_poll(__func__, "rfd", c, p, &pfd[p]); + p++; + } } - /* prepare c->wfd (if not already handled above) */ + /* prepare c->wfd if wanting IO and not already handled above */ if (c->wfd != -1 && c->rfd != c->wfd) { - if (c->pollfd_offset == -1) - c->pollfd_offset = p; - pfd[p].fd = c->wfd; - pfd[p].events = 0; - if ((c->io_want & SSH_CHAN_IO_WFD) != 0) - pfd[p].events = POLLOUT; - dump_channel_poll(__func__, "wfd", c, p, &pfd[p]); - p++; + ev = 0; + if ((c->io_want & SSH_CHAN_IO_WFD)) + ev |= POLLOUT; + /* Pack a pfd entry if any event armed for this fd */ + if (ev != 0) { + c->pfds[1] = p; + pfd[p].fd = c->wfd; + pfd[p].events = ev; + dump_channel_poll(__func__, "wfd", c, p, &pfd[p]); + p++; + } } - /* prepare c->efd (if not already handled above) */ + /* prepare c->efd if wanting IO and not already handled above */ if (c->efd != -1 && c->rfd != c->efd) { - if (c->pollfd_offset == -1) - c->pollfd_offset = p; - pfd[p].fd = c->efd; - pfd[p].events = 0; + ev = 0; if ((c->io_want & SSH_CHAN_IO_EFD_R) != 0) - pfd[p].events |= POLLIN; + ev |= POLLIN; if ((c->io_want & SSH_CHAN_IO_EFD_W) != 0) - pfd[p].events |= POLLOUT; - dump_channel_poll(__func__, "efd", c, p, &pfd[p]); - p++; + ev |= POLLOUT; + /* Pack a pfd entry if any event armed for this fd */ + if (ev != 0) { + c->pfds[2] = p; + pfd[p].fd = c->efd; + pfd[p].events = ev; + dump_channel_poll(__func__, "efd", c, p, &pfd[p]); + p++; + } } - /* prepare c->sock (if not already handled above) */ + /* prepare c->sock if wanting IO and not already handled above */ if (c->sock != -1 && c->rfd != c->sock) { - if (c->pollfd_offset == -1) - c->pollfd_offset = p; - pfd[p].fd = c->sock; - pfd[p].events = 0; + ev = 0; if ((c->io_want & SSH_CHAN_IO_SOCK_R) != 0) - pfd[p].events |= POLLIN; + ev |= POLLIN; if ((c->io_want & SSH_CHAN_IO_SOCK_W) != 0) - pfd[p].events |= POLLOUT; - dump_channel_poll(__func__, "sock", c, p, &pfd[p]); - p++; + ev |= POLLOUT; + /* Pack a pfd entry if any event armed for this fd */ + if (ev != 0) { + c->pfds[3] = p; + pfd[p].fd = c->sock; + pfd[p].events = 0; + dump_channel_poll(__func__, "sock", c, p, &pfd[p]); + p++; + } } *next_pollfd = p; } @@ -2614,13 +2634,15 @@ channel_prepare_poll(struct ssh *ssh, struct pollfd **pfdp, u_int *npfd_allocp, } static void -fd_ready(Channel *c, u_int p, struct pollfd *pfds, int fd, +fd_ready(Channel *c, int p, struct pollfd *pfds, u_int npfd, int fd, const char *what, u_int revents_mask, u_int ready) { struct pollfd *pfd = &pfds[p]; if (fd == -1) return; + if (p == -1 || (u_int)p >= npfd) + fatal_f("channel %d: bad pfd %d (max %u)", c->self, p, npfd); dump_channel_poll(__func__, what, c, p, pfd); if (pfd->fd != fd) { fatal("channel %d: inconsistent %s fd=%d pollfd[%u].fd %d " @@ -2643,11 +2665,12 @@ void channel_after_poll(struct ssh *ssh, struct pollfd *pfd, u_int npfd) { struct ssh_channels *sc = ssh->chanctxt; - u_int i, p; + u_int i; + int p; Channel *c; #ifdef DEBUG_CHANNEL_POLL - for (p = 0; p < npfd; p++) { + for (p = 0; p < (int)npfd; p++) { if (pfd[p].revents == 0) continue; debug_f("pfd[%u].fd %d rev 0x%04x", @@ -2658,13 +2681,8 @@ channel_after_poll(struct ssh *ssh, struct pollfd *pfd, u_int npfd) /* Convert pollfd into c->io_ready */ for (i = 0; i < sc->channels_alloc; i++) { c = sc->channels[i]; - if (c == NULL || c->pollfd_offset < 0) + if (c == NULL) continue; - if ((u_int)c->pollfd_offset >= npfd) { - /* shouldn't happen */ - fatal_f("channel %d: (before) bad pfd %u (max %u)", - c->self, c->pollfd_offset, npfd); - } /* if rfd is shared with efd/sock then wfd should be too */ if (c->rfd != -1 && c->wfd != -1 && c->rfd != c->wfd && (c->rfd == c->efd || c->rfd == c->sock)) { @@ -2673,56 +2691,52 @@ channel_after_poll(struct ssh *ssh, struct pollfd *pfd, u_int npfd) c->self, c->rfd, c->wfd, c->efd, c->sock); } c->io_ready = 0; - p = c->pollfd_offset; /* rfd, potentially shared with wfd, efd and sock */ - if (c->rfd != -1) { - fd_ready(c, p, pfd, c->rfd, "rfd", POLLIN, - SSH_CHAN_IO_RFD); + if (c->rfd != -1 && (p = c->pfds[0]) != -1) { + fd_ready(c, p, pfd, npfd, c->rfd, + "rfd", POLLIN, SSH_CHAN_IO_RFD); if (c->rfd == c->wfd) { - fd_ready(c, p, pfd, c->wfd, "wfd/r", POLLOUT, - SSH_CHAN_IO_WFD); + fd_ready(c, p, pfd, npfd, c->wfd, + "wfd/r", POLLOUT, SSH_CHAN_IO_WFD); } if (c->rfd == c->efd) { - fd_ready(c, p, pfd, c->efd, "efdr/r", POLLIN, - SSH_CHAN_IO_EFD_R); - fd_ready(c, p, pfd, c->efd, "efdw/r", POLLOUT, - SSH_CHAN_IO_EFD_W); + fd_ready(c, p, pfd, npfd, c->efd, + "efdr/r", POLLIN, SSH_CHAN_IO_EFD_R); + fd_ready(c, p, pfd, npfd, c->efd, + "efdw/r", POLLOUT, SSH_CHAN_IO_EFD_W); } if (c->rfd == c->sock) { - fd_ready(c, p, pfd, c->sock, "sockr/r", POLLIN, - SSH_CHAN_IO_SOCK_R); - fd_ready(c, p, pfd, c->sock, "sockw/r", POLLOUT, - SSH_CHAN_IO_SOCK_W); + fd_ready(c, p, pfd, npfd, c->sock, + "sockr/r", POLLIN, SSH_CHAN_IO_SOCK_R); + fd_ready(c, p, pfd, npfd, c->sock, + "sockw/r", POLLOUT, SSH_CHAN_IO_SOCK_W); } - p++; + dump_channel_poll(__func__, "rfd", c, p, pfd); } /* wfd */ - if (c->wfd != -1 && c->wfd != c->rfd) { - fd_ready(c, p, pfd, c->wfd, "wfd", POLLOUT, - SSH_CHAN_IO_WFD); - p++; + if (c->wfd != -1 && c->wfd != c->rfd && + (p = c->pfds[1]) != -1) { + fd_ready(c, p, pfd, npfd, c->wfd, + "wfd", POLLOUT, SSH_CHAN_IO_WFD); + dump_channel_poll(__func__, "wfd", c, p, pfd); } /* efd */ - if (c->efd != -1 && c->efd != c->rfd) { - fd_ready(c, p, pfd, c->efd, "efdr", POLLIN, - SSH_CHAN_IO_EFD_R); - fd_ready(c, p, pfd, c->efd, "efdw", POLLOUT, - SSH_CHAN_IO_EFD_W); - p++; + if (c->efd != -1 && c->efd != c->rfd && + (p = c->pfds[2]) != -1) { + fd_ready(c, p, pfd, npfd, c->efd, + "efdr", POLLIN, SSH_CHAN_IO_EFD_R); + fd_ready(c, p, pfd, npfd, c->efd, + "efdw", POLLOUT, SSH_CHAN_IO_EFD_W); + dump_channel_poll(__func__, "efd", c, p, pfd); } /* sock */ - if (c->sock != -1 && c->sock != c->rfd) { - fd_ready(c, p, pfd, c->sock, "sockr", POLLIN, - SSH_CHAN_IO_SOCK_R); - fd_ready(c, p, pfd, c->sock, "sockw", POLLOUT, - SSH_CHAN_IO_SOCK_W); - p++; - } - - if (p > npfd) { - /* shouldn't happen */ - fatal_f("channel %d: (after) bad pfd %u (max %u)", - c->self, c->pollfd_offset, npfd); + if (c->sock != -1 && c->sock != c->rfd && + (p = c->pfds[3]) != -1) { + fd_ready(c, p, pfd, npfd, c->sock, + "sockr", POLLIN, SSH_CHAN_IO_SOCK_R); + fd_ready(c, p, pfd, npfd, c->sock, + "sockw", POLLOUT, SSH_CHAN_IO_SOCK_W); + dump_channel_poll(__func__, "sock", c, p, pfd); } } channel_handler(ssh, CHAN_POST, NULL); diff --git a/channels.h b/channels.h index 82f33ba2f..dfb82f8ce 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.141 2022/01/22 00:49:34 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.142 2022/03/30 21:10:25 djm Exp $ */ /* * Author: Tatu Ylonen @@ -138,7 +138,7 @@ struct Channel { int sock; /* sock fd */ u_int io_want; /* bitmask of SSH_CHAN_IO_* */ u_int io_ready; /* bitmask of SSH_CHAN_IO_* */ - int pollfd_offset; /* base offset into pollfd array (or -1) */ + int pfds[4]; /* pollfd entries for rfd/wfd/efd/sock */ int ctl_chan; /* control channel (multiplexed connections) */ int isatty; /* rfd is a tty */ #ifdef _AIX From 32dc1c29a4ac9c592ddfef0a4895eb36c1f567ba Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 30 Mar 2022 21:13:23 +0000 Subject: [PATCH 041/287] upstream: select post-quantum KEX sntrup761x25519-sha512@openssh.com as the default; ok markus@ OpenBSD-Commit-ID: f02d99cbfce22dffec2e2ab1b60905fbddf48fb9 --- myproposal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/myproposal.h b/myproposal.h index ee50d215b..ee6e9f741 100644 --- a/myproposal.h +++ b/myproposal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: myproposal.h,v 1.70 2021/11/10 06:29:25 djm Exp $ */ +/* $OpenBSD: myproposal.h,v 1.71 2022/03/30 21:13:23 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -25,12 +25,12 @@ */ #define KEX_SERVER_KEX \ + "sntrup761x25519-sha512@openssh.com," \ "curve25519-sha256," \ "curve25519-sha256@libssh.org," \ "ecdh-sha2-nistp256," \ "ecdh-sha2-nistp384," \ "ecdh-sha2-nistp521," \ - "sntrup761x25519-sha512@openssh.com," \ "diffie-hellman-group-exchange-sha256," \ "diffie-hellman-group16-sha512," \ "diffie-hellman-group18-sha512," \ From 7988bfc4b701c4b3fe9b36c8561a3d1c5d4c9a74 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 31 Mar 2022 03:05:49 +0000 Subject: [PATCH 042/287] upstream: add support for the "corp-data" protocol extension to allow server-side copies to be performed without having to go via the client. Patch by Mike Frysinger, ok dtucker@ OpenBSD-Commit-ID: 00aa510940fedd66dab1843b58682de4eb7156d5 --- PROTOCOL | 41 ++++++++++++++++++++-- sftp-server.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 132 insertions(+), 3 deletions(-) diff --git a/PROTOCOL b/PROTOCOL index e6a7d60ee..2d50b5cb0 100644 --- a/PROTOCOL +++ b/PROTOCOL @@ -492,7 +492,7 @@ This request asks the server to call fsync(2) on an open file handle. string "fsync@openssh.com" string handle -One receiving this request, a server will call fsync(handle_fd) and will +On receiving this request, a server will call fsync(handle_fd) and will respond with a SSH_FXP_STATUS message. This extension is advertised in the SSH_FXP_VERSION hello with version @@ -576,6 +576,43 @@ Its reply is the same format as that of SSH2_FXP_REALPATH. This extension is advertised in the SSH_FXP_VERSION hello with version "1". +4.10. sftp: Extension request "copy-data" + +This request asks the server to copy data from one open file handle and +write it to a different open file handle. This avoids needing to transfer +the data across the network twice (a download followed by an upload). + + byte SSH_FXP_EXTENDED + uint32 id + string "copy-data" + string read-from-handle + uint64 read-from-offset + uint64 read-data-length + string write-to-handle + uint64 write-to-offset + +The server will copy read-data-length bytes starting from +read-from-offset from the read-from-handle and write them to +write-to-handle starting from write-to-offset, and then respond with a +SSH_FXP_STATUS message. + +It's equivalent to issuing a series of SSH_FXP_READ requests on +read-from-handle and a series of requests of SSH_FXP_WRITE on +write-to-handle. + +If read-from-handle and write-to-handle are the same, the server will +fail the request and respond with a SSH_FX_INVALID_PARAMETER message. + +If read-data-length is 0, then the server will read data from the +read-from-handle until EOF is reached. + +This extension is advertised in the SSH_FXP_VERSION hello with version +"1". + +This request is identical to the "copy-data" request documented in: + +https://tools.ietf.org/html/draft-ietf-secsh-filexfer-extensions-00#section-7 + 5. Miscellaneous changes 5.1 Public key format @@ -612,4 +649,4 @@ master instance and later clients. OpenSSH extends the usual agent protocol. These changes are documented in the PROTOCOL.agent file. -$OpenBSD: PROTOCOL,v 1.43 2021/12/19 22:15:42 djm Exp $ +$OpenBSD: PROTOCOL,v 1.44 2022/03/31 03:05:49 djm Exp $ diff --git a/sftp-server.c b/sftp-server.c index d4c6a3b4c..3dd19d4c8 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.139 2022/02/01 23:32:51 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.140 2022/03/31 03:05:49 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -44,6 +44,7 @@ #include #include +#include "atomicio.h" #include "xmalloc.h" #include "sshbuf.h" #include "ssherr.h" @@ -119,6 +120,7 @@ static void process_extended_fsync(u_int32_t id); static void process_extended_lsetstat(u_int32_t id); static void process_extended_limits(u_int32_t id); static void process_extended_expand(u_int32_t id); +static void process_extended_copy_data(u_int32_t id); static void process_extended(u_int32_t id); struct sftp_handler { @@ -164,6 +166,7 @@ static const struct sftp_handler extended_handlers[] = { { "limits", "limits@openssh.com", 0, process_extended_limits, 0 }, { "expand-path", "expand-path@openssh.com", 0, process_extended_expand, 0 }, + { "copy-data", "copy-data", 0, process_extended_copy_data, 1 }, { NULL, NULL, 0, NULL, 0 } }; @@ -720,6 +723,7 @@ process_init(void) compose_extension(msg, "lsetstat@openssh.com", "1"); compose_extension(msg, "limits@openssh.com", "1"); compose_extension(msg, "expand-path@openssh.com", "1"); + compose_extension(msg, "copy-data", "1"); send_msg(msg); sshbuf_free(msg); @@ -1592,6 +1596,94 @@ process_extended_expand(u_int32_t id) free(path); } +static void +process_extended_copy_data(u_int32_t id) +{ + u_char buf[64*1024]; + int read_handle, read_fd, write_handle, write_fd; + u_int64_t len, read_off, read_len, write_off; + int r, copy_until_eof, status = SSH2_FX_OP_UNSUPPORTED; + size_t ret; + + if ((r = get_handle(iqueue, &read_handle)) != 0 || + (r = sshbuf_get_u64(iqueue, &read_off)) != 0 || + (r = sshbuf_get_u64(iqueue, &read_len)) != 0 || + (r = get_handle(iqueue, &write_handle)) != 0 || + (r = sshbuf_get_u64(iqueue, &write_off)) != 0) + fatal("%s: buffer error: %s", __func__, ssh_err(r)); + + debug("request %u: copy-data from \"%s\" (handle %d) off %llu len %llu " + "to \"%s\" (handle %d) off %llu", + id, handle_to_name(read_handle), read_handle, + (unsigned long long)read_off, (unsigned long long)read_len, + handle_to_name(write_handle), write_handle, + (unsigned long long)write_off); + + /* For read length of 0, we read until EOF. */ + if (read_len == 0) { + read_len = (u_int64_t)-1 - read_off; + copy_until_eof = 1; + } else + copy_until_eof = 0; + + read_fd = handle_to_fd(read_handle); + write_fd = handle_to_fd(write_handle); + + /* Disallow reading & writing to the same handle or same path or dirs */ + if (read_handle == write_handle || read_fd < 0 || write_fd < 0 || + !strcmp(handle_to_name(read_handle), handle_to_name(write_handle))) { + status = SSH2_FX_FAILURE; + goto out; + } + + if (lseek(read_fd, read_off, SEEK_SET) < 0) { + status = errno_to_portable(errno); + error("%s: read_seek failed", __func__); + goto out; + } + + if ((handle_to_flags(write_handle) & O_APPEND) == 0 && + lseek(write_fd, write_off, SEEK_SET) < 0) { + status = errno_to_portable(errno); + error("%s: write_seek failed", __func__); + goto out; + } + + /* Process the request in chunks. */ + while (read_len > 0 || copy_until_eof) { + len = MINIMUM(sizeof(buf), read_len); + read_len -= len; + + ret = atomicio(read, read_fd, buf, len); + if (ret == 0 && errno == EPIPE) { + status = copy_until_eof ? SSH2_FX_OK : SSH2_FX_EOF; + break; + } else if (ret == 0) { + status = errno_to_portable(errno); + error("%s: read failed: %s", __func__, strerror(errno)); + break; + } + len = ret; + handle_update_read(read_handle, len); + + ret = atomicio(vwrite, write_fd, buf, len); + if (ret != len) { + status = errno_to_portable(errno); + error("%s: write failed: %llu != %llu: %s", __func__, + (unsigned long long)ret, (unsigned long long)len, + strerror(errno)); + break; + } + handle_update_write(write_handle, len); + } + + if (read_len == 0) + status = SSH2_FX_OK; + + out: + send_status(id, status); +} + static void process_extended(u_int32_t id) { From 3fa539c3ffaabd6211995512d33e29150f88c5c5 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 31 Mar 2022 03:07:03 +0000 Subject: [PATCH 043/287] upstream: add a sftp client "cp" command that supports server-side copying of files. Useful for this task and for testing the copy-data extension. Patch from Mike Frysinger; ok dtucker@ OpenBSD-Commit-ID: 1bb1b950af0d49f0d5425b1f267e197aa1b57444 --- sftp-client.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++++- sftp-client.h | 5 ++- sftp.1 | 18 ++++++-- sftp.c | 16 ++++++- 4 files changed, 155 insertions(+), 6 deletions(-) diff --git a/sftp-client.c b/sftp-client.c index c75657553..1b8ce6d78 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.161 2022/01/17 21:41:04 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.162 2022/03/31 03:07:03 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -103,6 +103,7 @@ struct sftp_conn { #define SFTP_EXT_LSETSTAT 0x00000020 #define SFTP_EXT_LIMITS 0x00000040 #define SFTP_EXT_PATH_EXPAND 0x00000080 +#define SFTP_EXT_COPY_DATA 0x00000100 u_int exts; u_int64_t limit_kbps; struct bwlimit bwlimit_in, bwlimit_out; @@ -534,6 +535,10 @@ do_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests, strcmp((char *)value, "1") == 0) { ret->exts |= SFTP_EXT_PATH_EXPAND; known = 1; + } else if (strcmp(name, "copy-data") == 0 && + strcmp((char *)value, "1") == 0) { + ret->exts |= SFTP_EXT_COPY_DATA; + known = 1; } if (known) { debug2("Server supports extension \"%s\" revision %s", @@ -1078,6 +1083,121 @@ do_expand_path(struct sftp_conn *conn, const char *path) return do_realpath_expand(conn, path, 1); } +int +do_copy(struct sftp_conn *conn, const char *oldpath, const char *newpath) +{ + Attrib junk, *a; + struct sshbuf *msg; + u_char *old_handle, *new_handle; + u_int mode, status, id; + size_t old_handle_len, new_handle_len; + int r; + + /* Return if the extension is not supported */ + if ((conn->exts & SFTP_EXT_COPY_DATA) == 0) { + error("Server does not support copy-data extension"); + return -1; + } + + /* Make sure the file exists, and we can copy its perms */ + if ((a = do_stat(conn, oldpath, 0)) == NULL) + return -1; + + /* Do not preserve set[ug]id here, as we do not preserve ownership */ + if (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) { + mode = a->perm & 0777; + + if (!S_ISREG(a->perm)) { + error("Cannot copy non-regular file: %s", oldpath); + return -1; + } + } else { + /* NB: The user's umask will apply to this */ + mode = 0666; + } + + /* Set up the new perms for the new file */ + attrib_clear(a); + a->perm = mode; + a->flags |= SSH2_FILEXFER_ATTR_PERMISSIONS; + + if ((msg = sshbuf_new()) == NULL) + fatal("%s: sshbuf_new failed", __func__); + + attrib_clear(&junk); /* Send empty attributes */ + + /* Open the old file for reading */ + id = conn->msg_id++; + if ((r = sshbuf_put_u8(msg, SSH2_FXP_OPEN)) != 0 || + (r = sshbuf_put_u32(msg, id)) != 0 || + (r = sshbuf_put_cstring(msg, oldpath)) != 0 || + (r = sshbuf_put_u32(msg, SSH2_FXF_READ)) != 0 || + (r = encode_attrib(msg, &junk)) != 0) + fatal("%s: buffer error: %s", __func__, ssh_err(r)); + send_msg(conn, msg); + debug3("Sent message SSH2_FXP_OPEN I:%u P:%s", id, oldpath); + + sshbuf_reset(msg); + + old_handle = get_handle(conn, id, &old_handle_len, + "remote open(\"%s\")", oldpath); + if (old_handle == NULL) { + sshbuf_free(msg); + return -1; + } + + /* Open the new file for writing */ + id = conn->msg_id++; + if ((r = sshbuf_put_u8(msg, SSH2_FXP_OPEN)) != 0 || + (r = sshbuf_put_u32(msg, id)) != 0 || + (r = sshbuf_put_cstring(msg, newpath)) != 0 || + (r = sshbuf_put_u32(msg, SSH2_FXF_WRITE|SSH2_FXF_CREAT| + SSH2_FXF_TRUNC)) != 0 || + (r = encode_attrib(msg, a)) != 0) + fatal("%s: buffer error: %s", __func__, ssh_err(r)); + send_msg(conn, msg); + debug3("Sent message SSH2_FXP_OPEN I:%u P:%s", id, newpath); + + sshbuf_reset(msg); + + new_handle = get_handle(conn, id, &new_handle_len, + "remote open(\"%s\")", newpath); + if (new_handle == NULL) { + sshbuf_free(msg); + free(old_handle); + return -1; + } + + /* Copy the file data */ + id = conn->msg_id++; + if ((r = sshbuf_put_u8(msg, SSH2_FXP_EXTENDED)) != 0 || + (r = sshbuf_put_u32(msg, id)) != 0 || + (r = sshbuf_put_cstring(msg, "copy-data")) != 0 || + (r = sshbuf_put_string(msg, old_handle, old_handle_len)) != 0 || + (r = sshbuf_put_u64(msg, 0)) != 0 || + (r = sshbuf_put_u64(msg, 0)) != 0 || + (r = sshbuf_put_string(msg, new_handle, new_handle_len)) != 0 || + (r = sshbuf_put_u64(msg, 0)) != 0) + fatal("%s: buffer error: %s", __func__, ssh_err(r)); + send_msg(conn, msg); + debug3("Sent message copy-data \"%s\" 0 0 -> \"%s\" 0", + oldpath, newpath); + + status = get_status(conn, id); + if (status != SSH2_FX_OK) + error("Couldn't copy file \"%s\" to \"%s\": %s", oldpath, + newpath, fx2txt(status)); + + /* Clean up everything */ + sshbuf_free(msg); + do_close(conn, old_handle, old_handle_len); + do_close(conn, new_handle, new_handle_len); + free(old_handle); + free(new_handle); + + return status == SSH2_FX_OK ? 0 : -1; +} + int do_rename(struct sftp_conn *conn, const char *oldpath, const char *newpath, int force_legacy) diff --git a/sftp-client.h b/sftp-client.h index 8851b23b8..282a4c700 100644 --- a/sftp-client.h +++ b/sftp-client.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.h,v 1.35 2022/01/01 01:55:30 jsg Exp $ */ +/* $OpenBSD: sftp-client.h,v 1.36 2022/03/31 03:07:03 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller @@ -125,6 +125,9 @@ int do_statvfs(struct sftp_conn *, const char *, struct sftp_statvfs *, int); /* Rename 'oldpath' to 'newpath' */ int do_rename(struct sftp_conn *, const char *, const char *, int); +/* Copy 'oldpath' to 'newpath' */ +int do_copy(struct sftp_conn *, const char *, const char *); + /* Link 'oldpath' to 'newpath' */ int do_hardlink(struct sftp_conn *, const char *, const char *); diff --git a/sftp.1 b/sftp.1 index 7eebeeacb..766adceea 100644 --- a/sftp.1 +++ b/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.138 2021/07/02 05:11:21 dtucker Exp $ +.\" $OpenBSD: sftp.1,v 1.139 2022/03/31 03:07:03 djm Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: July 2 2021 $ +.Dd $Mdocdate: March 31 2022 $ .Dt SFTP 1 .Os .Sh NAME @@ -144,7 +144,7 @@ will abort if any of the following commands fail: .Ic get , put , reget , reput , rename , ln , .Ic rm , mkdir , chdir , ls , -.Ic lchdir , chmod , chown , +.Ic lchdir , copy , cp , chmod , chown , .Ic chgrp , lpwd , df , symlink , and .Ic lmkdir . @@ -400,6 +400,18 @@ If the flag is specified, then symlinks will not be followed. Note that this is only supported by servers that implement the "lsetstat@openssh.com" extension. +.It Ic copy Ar oldpath Ar newpath +Copy remote file from +.Ar oldpath +to +.Ar newpath . +.Pp +Note that this is only supported by servers that implement the "copy-data" +extension. +.It Ic cp Ar oldpath Ar newpath +Alias to +.Ic copy +command. .It Xo Ic df .Op Fl hi .Op Ar path diff --git a/sftp.c b/sftp.c index 01e0afefa..4efc025a5 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.213 2022/03/18 02:50:21 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.214 2022/03/31 03:07:03 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -137,6 +137,7 @@ enum sftp_command { I_CHGRP, I_CHMOD, I_CHOWN, + I_COPY, I_DF, I_GET, I_HELP, @@ -180,6 +181,8 @@ static const struct CMD cmds[] = { { "chgrp", I_CHGRP, REMOTE }, { "chmod", I_CHMOD, REMOTE }, { "chown", I_CHOWN, REMOTE }, + { "copy", I_COPY, REMOTE }, + { "cp", I_COPY, REMOTE }, { "df", I_DF, REMOTE }, { "dir", I_LS, REMOTE }, { "exit", I_QUIT, NOARGS }, @@ -286,6 +289,8 @@ help(void) "chgrp [-h] grp path Change group of file 'path' to 'grp'\n" "chmod [-h] mode path Change permissions of file 'path' to 'mode'\n" "chown [-h] own path Change owner of file 'path' to 'own'\n" + "copy oldpath newpath Copy remote file\n" + "cp oldpath newpath Copy remote file\n" "df [-hi] [path] Display statistics for current directory or\n" " filesystem containing 'path'\n" "exit Quit sftp\n" @@ -1369,6 +1374,10 @@ parse_args(const char **cpp, int *ignore_errors, int *disable_echo, int *aflag, if ((optidx = parse_link_flags(cmd, argv, argc, sflag)) == -1) return -1; goto parse_two_paths; + case I_COPY: + if ((optidx = parse_no_flags(cmd, argv, argc)) == -1) + return -1; + goto parse_two_paths; case I_RENAME: if ((optidx = parse_rename_flags(cmd, argv, argc, lflag)) == -1) return -1; @@ -1536,6 +1545,11 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, err = process_put(conn, path1, path2, *pwd, pflag, rflag, aflag, fflag); break; + case I_COPY: + path1 = make_absolute(path1, *pwd); + path2 = make_absolute(path2, *pwd); + err = do_copy(conn, path1, path2); + break; case I_RENAME: path1 = make_absolute(path1, *pwd); path2 = make_absolute(path2, *pwd); From b275818065b31a865142c48c2acf6a7c1655c542 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Thu, 31 Mar 2022 14:11:36 +1100 Subject: [PATCH 044/287] depend --- .depend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.depend b/.depend index 945a01dcc..cd38d15f8 100644 --- a/.depend +++ b/.depend @@ -121,7 +121,7 @@ sftp-common.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-c sftp-glob.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sftp.h sftp-common.h sftp-client.h openbsd-compat/glob.h sftp-realpath.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sftp-server-main.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sftp.h misc.h xmalloc.h -sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h +sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h pathnames.h misc.h utf8.h sftp.h sshbuf.h sftp-common.h sftp-client.h openbsd-compat/glob.h sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h From 5b054d76402faab38c48377efd112426469553a0 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 13:16:47 +1100 Subject: [PATCH 045/287] Skip slow tests on (very) slow test targets. --- .github/configs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/configs b/.github/configs index 69ef9bbb7..b0fb3849a 100755 --- a/.github/configs +++ b/.github/configs @@ -145,6 +145,12 @@ case "$config" in esac case "${TARGET_HOST}" in + aix*) + # These are slow real or virtual machines so skip the slowest tests + # (which tend to be thw ones that transfer lots of data) so that the + # test run does not time out. + SKIP_LTESTS="rekey sftp" + ;; dfly58*|dfly60*) # scp 3-way connection hangs on these so skip until sorted. SKIP_LTESTS=scp3 From 34c7018c316af4773e432066de28d0ef9d0888cd Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 14:56:54 +1100 Subject: [PATCH 046/287] Set Makefile SHELL as determined by configure. This should improve compatibility for users with non-POSIX shells. If using Makefile.in directly (eg make -f Makefile.in distprep) then SHELL will need to be specified on the command line (along with MANFMT in that particular case). ok djm@ --- Makefile.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index a9b802b7d..7250d3f31 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1,5 +1,4 @@ -# uncomment if you run a non bourne compatible shell. Ie. csh -#SHELL = @SH@ +SHELL=@SH@ AUTORECONF=autoreconf From 02488c1b54065ddc4f25835dbd2618b2a2fe21f5 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 16:27:38 +1100 Subject: [PATCH 047/287] Use bash or ksh if available for SH in Makefile. --- configure.ac | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac index 42fd890b9..c285ea32b 100644 --- a/configure.ac +++ b/configure.ac @@ -48,6 +48,8 @@ AC_PATH_PROG([SED], [sed]) AC_PATH_PROG([TEST_MINUS_S_SH], [bash]) AC_PATH_PROG([TEST_MINUS_S_SH], [ksh]) AC_PATH_PROG([TEST_MINUS_S_SH], [sh]) +AC_PATH_PROG([SH], [bash]) +AC_PATH_PROG([SH], [ksh]) AC_PATH_PROG([SH], [sh]) AC_PATH_PROG([GROFF], [groff]) AC_PATH_PROG([NROFF], [nroff awf]) From f67e47903977b42cb6abcd5565a61bd7293e4dc3 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 23:21:06 +1100 Subject: [PATCH 048/287] Increase test timeout to allow slow VMs to finish --- .github/workflows/selfhosted.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index e8ce6ac40..ec2c29825 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -92,7 +92,7 @@ jobs: run: vmrun make - name: make tests run: vmrun ./.github/run_test.sh ${{ matrix.configs }} - timeout-minutes: 300 + timeout-minutes: 600 - name: save logs if: failure() uses: actions/upload-artifact@v2 From 6c49eb5fabc56f4865164ed818aa5112d09c31a8 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 23:21:40 +1100 Subject: [PATCH 049/287] Only run regression tests on slow VMs. --- .github/configs | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/configs b/.github/configs index b0fb3849a..58e01228d 100755 --- a/.github/configs +++ b/.github/configs @@ -149,6 +149,7 @@ case "${TARGET_HOST}" in # These are slow real or virtual machines so skip the slowest tests # (which tend to be thw ones that transfer lots of data) so that the # test run does not time out. + TEST_TARGET=t-exec SKIP_LTESTS="rekey sftp" ;; dfly58*|dfly60*) From 90452c8b69d065b7c7c285ff78b81418a75bcd76 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Apr 2022 23:38:44 +1100 Subject: [PATCH 050/287] Only return events from ppoll that were requested. If the underlying system's select() returns bits that were not in the request set, our ppoll() implementation can return revents for events not requested, which can apparently cause a hang. Only return revents for activity in the requested event set. bz#3416, analysis and fix by yaroslav.kuzmin at vmssoftware com, ok djm@ --- openbsd-compat/bsd-poll.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openbsd-compat/bsd-poll.c b/openbsd-compat/bsd-poll.c index 781ee978a..9a9794f58 100644 --- a/openbsd-compat/bsd-poll.c +++ b/openbsd-compat/bsd-poll.c @@ -91,11 +91,11 @@ ppoll(struct pollfd *fds, nfds_t nfds, const struct timespec *tmoutp, fds[i].revents = 0; if (fd == -1) continue; - if (FD_ISSET(fd, readfds)) + if ((fds[i].events & POLLIN) && FD_ISSET(fd, readfds)) fds[i].revents |= POLLIN; - if (FD_ISSET(fd, writefds)) + if ((fds[i].events & POLLOUT) && FD_ISSET(fd, writefds)) fds[i].revents |= POLLOUT; - if (FD_ISSET(fd, exceptfds)) + if ((fds[i].events & POLLPRI) && FD_ISSET(fd, exceptfds)) fds[i].revents |= POLLPRI; } From 32c12236f27ae83bfe6d2983b67c9bc67a83a417 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 Apr 2022 15:16:51 +1000 Subject: [PATCH 051/287] Specify TEST_SHELL=bash on AIX. The system shells cause the agent-restrict test to fail due to some quoting so explicitly specify bash until we can get configure to autmatically work around that. --- .github/configs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/configs b/.github/configs index 58e01228d..02f8bdc8e 100755 --- a/.github/configs +++ b/.github/configs @@ -149,7 +149,9 @@ case "${TARGET_HOST}" in # These are slow real or virtual machines so skip the slowest tests # (which tend to be thw ones that transfer lots of data) so that the # test run does not time out. - TEST_TARGET=t-exec + # The agent-restrict test fails due to some quoting issue when run + # with sh or ksh so specify bash for now. + TEST_TARGET="t-exec TEST_SHELL=bash" SKIP_LTESTS="rekey sftp" ;; dfly58*|dfly60*) From 3741df98ffaaff92b474ee70d8ef276b5882f85a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 4 Apr 2022 23:52:11 +1000 Subject: [PATCH 052/287] Disable security key on fbsd6 test host. --- .github/configs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/configs b/.github/configs index 02f8bdc8e..871a3d414 100755 --- a/.github/configs +++ b/.github/configs @@ -158,6 +158,10 @@ case "${TARGET_HOST}" in # scp 3-way connection hangs on these so skip until sorted. SKIP_LTESTS=scp3 ;; + fbsd6) + # Native linker is not great with PIC so OpenSSL is built w/out. + CONFIGFLAGS="${CONFIGFLAGS} --disable-security-key" + ;; hurd) SKIP_LTESTS="forwarding multiplex proxy-connect hostkey-agent agent-ptrace" ;; From 9ec2713d122af79d66ebb9c1d6d9ae8621a8945f Mon Sep 17 00:00:00 2001 From: "naddy@openbsd.org" Date: Thu, 31 Mar 2022 17:27:27 +0000 Subject: [PATCH 053/287] upstream: man pages: add missing commas between subordinate and main clauses jmc@ dislikes a comma before "then" in a conditional, so leave those untouched. ok jmc@ OpenBSD-Commit-ID: 9520801729bebcb3c9fe43ad7f9776ab4dd05ea3 --- sftp.1 | 4 ++-- ssh-agent.1 | 8 ++++---- ssh-keysign.8 | 6 +++--- ssh.1 | 10 +++++----- ssh_config.5 | 8 ++++---- sshd.8 | 6 +++--- 6 files changed, 21 insertions(+), 21 deletions(-) diff --git a/sftp.1 b/sftp.1 index 766adceea..39e7d6ed6 100644 --- a/sftp.1 +++ b/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.139 2022/03/31 03:07:03 djm Exp $ +.\" $OpenBSD: sftp.1,v 1.140 2022/03/31 17:27:27 naddy Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -126,7 +126,7 @@ Batch mode reads a series of commands from an input .Ar batchfile instead of .Em stdin . -Since it lacks user interaction it should be used in conjunction with +Since it lacks user interaction, it should be used in conjunction with non-interactive authentication to obviate the need to enter a password at connection time (see .Xr sshd 8 diff --git a/ssh-agent.1 b/ssh-agent.1 index ed8c87096..ea43cd156 100644 --- a/ssh-agent.1 +++ b/ssh-agent.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-agent.1,v 1.72 2020/06/22 05:52:05 djm Exp $ +.\" $OpenBSD: ssh-agent.1,v 1.73 2022/03/31 17:27:27 naddy Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -34,7 +34,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 22 2020 $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSH-AGENT 1 .Os .Sh NAME @@ -82,12 +82,12 @@ This is the default if looks like it's a csh style of shell. .It Fl D Foreground mode. -When this option is specified +When this option is specified, .Nm will not fork. .It Fl d Debug mode. -When this option is specified +When this option is specified, .Nm will not fork and will write debug information to standard error. .It Fl E Ar fingerprint_hash diff --git a/ssh-keysign.8 b/ssh-keysign.8 index 73b62397c..6b4b9b270 100644 --- a/ssh-keysign.8 +++ b/ssh-keysign.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keysign.8,v 1.16 2019/11/30 07:07:59 jmc Exp $ +.\" $OpenBSD: ssh-keysign.8,v 1.17 2022/03/31 17:27:27 naddy Exp $ .\" .\" Copyright (c) 2002 Markus Friedl. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: November 30 2019 $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSH-KEYSIGN 8 .Os .Sh NAME @@ -77,7 +77,7 @@ must be set-uid root if host-based authentication is used. .It Pa /etc/ssh/ssh_host_ecdsa_key-cert.pub .It Pa /etc/ssh/ssh_host_ed25519_key-cert.pub .It Pa /etc/ssh/ssh_host_rsa_key-cert.pub -If these files exist they are assumed to contain public certificate +If these files exist, they are assumed to contain public certificate information corresponding with the private keys above. .El .Sh SEE ALSO diff --git a/ssh.1 b/ssh.1 index ce0024911..4a4f1683a 100644 --- a/ssh.1 +++ b/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.429 2022/02/06 00:29:03 jsg Exp $ -.Dd $Mdocdate: February 6 2022 $ +.\" $OpenBSD: ssh.1,v 1.430 2022/03/31 17:27:27 naddy Exp $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSH 1 .Os .Sh NAME @@ -705,7 +705,7 @@ argument is the listen port will be dynamically allocated on the server and reported to the client at run time. When used together with -.Ic -O forward +.Ic -O forward , the allocated port will be printed to the standard output. .Pp .It Fl S Ar ctl_path @@ -1045,7 +1045,7 @@ the user a normal shell as an interactive session. All communication with the remote command or shell will be automatically encrypted. .Pp -If an interactive session is requested +If an interactive session is requested, .Nm by default will only request a pseudo-terminal (pty) for interactive sessions when the client has one. @@ -1055,7 +1055,7 @@ and .Fl t can be used to override this behaviour. .Pp -If a pseudo-terminal has been allocated the +If a pseudo-terminal has been allocated, the user may use the escape characters noted below. .Pp If no pseudo-terminal has been allocated, diff --git a/ssh_config.5 b/ssh_config.5 index 69132282b..333dfc6b3 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.369 2022/02/15 05:13:36 djm Exp $ -.Dd $Mdocdate: February 15 2022 $ +.\" $OpenBSD: ssh_config.5,v 1.370 2022/03/31 17:27:27 naddy Exp $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -435,7 +435,7 @@ directives will add to the list of certificates used for authentication. .It Cm CheckHostIP If set to -.Cm yes +.Cm yes , .Xr ssh 1 will additionally check the host IP address in the .Pa known_hosts @@ -1581,7 +1581,7 @@ If forwarding to a specific destination then the second argument must be or a Unix domain socket path, otherwise if no destination argument is specified then the remote forwarding will be established as a SOCKS proxy. -When acting as a SOCKS proxy the destination of the connection can be +When acting as a SOCKS proxy, the destination of the connection can be restricted by .Cm PermitRemoteOpen . .Pp diff --git a/sshd.8 b/sshd.8 index ef38949a2..350b08ad2 100644 --- a/sshd.8 +++ b/sshd.8 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd.8,v 1.317 2021/09/10 11:38:38 dtucker Exp $ -.Dd $Mdocdate: September 10 2021 $ +.\" $OpenBSD: sshd.8,v 1.318 2022/03/31 17:27:27 naddy Exp $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSHD 8 .Os .Sh NAME @@ -650,7 +650,7 @@ Enable all restrictions, i.e. disable port, agent and X11 forwarding, as well as disabling PTY allocation and execution of .Pa ~/.ssh/rc . -If any future restriction capabilities are added to authorized_keys files +If any future restriction capabilities are added to authorized_keys files, they will be included in this set. .It Cm tunnel="n" Force a From a9f23ea2e3227f406880c2634d066f6f50fa5eaa Mon Sep 17 00:00:00 2001 From: "naddy@openbsd.org" Date: Thu, 31 Mar 2022 17:58:44 +0000 Subject: [PATCH 054/287] upstream: ssh: document sntrup761x25519-sha512@openssh.com as default KEX OpenBSD-Commit-ID: 12545bfa10bcbf552d04d9d9520d0f4e98b0e171 --- ssh_config.5 | 4 ++-- sshd_config.5 | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index 333dfc6b3..59ff96465 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,7 +33,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.370 2022/03/31 17:27:27 naddy Exp $ +.\" $OpenBSD: ssh_config.5,v 1.371 2022/03/31 17:58:44 naddy Exp $ .Dd $Mdocdate: March 31 2022 $ .Dt SSH_CONFIG 5 .Os @@ -1165,9 +1165,9 @@ character, then the specified algorithms will be placed at the head of the default set. The default is: .Bd -literal -offset indent +sntrup761x25519-sha512@openssh.com, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, -sntrup761x25519-sha512@openssh.com, diffie-hellman-group-exchange-sha256, diffie-hellman-group16-sha512, diffie-hellman-group18-sha512, diff --git a/sshd_config.5 b/sshd_config.5 index 985f1ba5c..3a4ffab7c 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.339 2021/12/04 00:05:39 naddy Exp $ -.Dd $Mdocdate: December 4 2021 $ +.\" $OpenBSD: sshd_config.5,v 1.340 2022/03/31 17:58:44 naddy Exp $ +.Dd $Mdocdate: March 31 2022 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -961,9 +961,9 @@ sntrup761x25519-sha512@openssh.com .Pp The default is: .Bd -literal -offset indent +sntrup761x25519-sha512@openssh.com, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, -sntrup761x25519-sha512@openssh.com, diffie-hellman-group-exchange-sha256, diffie-hellman-group16-sha512,diffie-hellman-group18-sha512, diffie-hellman-group14-sha256 From 8e4a8eadf4fe74e65e6492f34250f8cf7d67e8da Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 4 Apr 2022 22:45:25 +0000 Subject: [PATCH 055/287] upstream: openssh-9.0 OpenBSD-Commit-ID: 0dfb461188f4513ec024c1534da8c1ce14c20b64 --- version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.h b/version.h index 09da52d0d..e600fe4c3 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ -/* $OpenBSD: version.h,v 1.93 2022/02/23 11:07:09 djm Exp $ */ +/* $OpenBSD: version.h,v 1.94 2022/04/04 22:45:25 djm Exp $ */ -#define SSH_VERSION "OpenSSH_8.9" +#define SSH_VERSION "OpenSSH_9.0" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE From 94eb6858efecc1b4f02d8a6bd35e149f55c814c8 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 6 Apr 2022 10:47:48 +1000 Subject: [PATCH 056/287] update version numbers for release --- README | 2 +- contrib/redhat/openssh.spec | 2 +- contrib/suse/openssh.spec | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README b/README index a088ff8dc..70a8f814c 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -See https://www.openssh.com/releasenotes.html#8.9p1 for the release notes. +See https://www.openssh.com/releasenotes.html#9.0p1 for the release notes. Please read https://www.openssh.com/report.html for bug reporting instructions and note that we do not use Github for bug reporting or diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec index 95ab2199b..b8ba8bae0 100644 --- a/contrib/redhat/openssh.spec +++ b/contrib/redhat/openssh.spec @@ -1,4 +1,4 @@ -%global ver 8.9p1 +%global ver 9.0p1 %global rel 1%{?dist} # OpenSSH privilege separation requires a user & group ID diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec index 8df0ae3b0..28b9086f4 100644 --- a/contrib/suse/openssh.spec +++ b/contrib/suse/openssh.spec @@ -13,7 +13,7 @@ Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation Name: openssh -Version: 8.9p1 +Version: 9.0p1 URL: https://www.openssh.com/ Release: 1 Source0: openssh-%{version}.tar.gz From 0a8ca39fac6ad19096b6c263436f8b2dd51606f2 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 8 Apr 2022 14:48:58 +1000 Subject: [PATCH 057/287] update build-aux files to match autoconf-2.71 i.e. config.guess, config.sub and install-sh --- config.guess | 1015 ++++++++----------- config.sub | 2702 +++++++++++++++++++++++++------------------------- install-sh | 414 ++++---- 3 files changed, 2002 insertions(+), 2129 deletions(-) diff --git a/config.guess b/config.guess index 11fda528b..a4077cce0 100755 --- a/config.guess +++ b/config.guess @@ -1,12 +1,14 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright 1992-2020 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. -timestamp='2020-04-26' +timestamp='2012-09-25' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -15,22 +17,24 @@ timestamp='2020-04-26' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. # -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. # # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess -# -# Please send patches to . - +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD me=`echo "$0" | sed -e 's,.*/,,'` @@ -39,7 +43,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Options: +Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -50,7 +54,9 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright 1992-2020 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -84,6 +90,8 @@ if test $# != 0; then exit 1 fi +trap 'exit 1' 1 2 15 + # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -94,40 +102,34 @@ fi # Portable tmp directory creation inspired by the Autoconf team. -tmp= -# shellcheck disable=SC2172 -trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 - -set_cc_for_build() { - # prevent multiple calls if $tmp is already set - test "$tmp" && return 0 - : "${TMPDIR=/tmp}" - # shellcheck disable=SC2039 - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } - dummy=$tmp/dummy - case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in - ,,) echo "int x;" > "$dummy.c" - for driver in cc gcc c89 c99 ; do - if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then - CC_FOR_BUILD="$driver" - break - fi - done - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; - esac -} +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if test -f /.attbin/uname ; then +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi @@ -136,37 +138,9 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown -case "$UNAME_SYSTEM" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - set_cc_for_build - cat <<-EOF > "$dummy.c" - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" - - # If ldd exists, use it to detect musl libc. - if command -v ldd >/dev/null && \ - ldd --version 2>&1 | grep -q ^musl - then - LIBC=musl - fi - ;; -esac - # Note: order is significant - the case branches are not exclusive. -case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -179,31 +153,21 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ - "/sbin/$sysctl" 2>/dev/null || \ - "/usr/sbin/$sysctl" 2>/dev/null || \ - echo unknown)` - case "$UNAME_MACHINE_ARCH" in + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - earmv*) - arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` - machine="${arch}${endian}"-unknown - ;; - *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently (or will in the future) and ABI. - case "$UNAME_MACHINE_ARCH" in - earm*) - os=netbsdelf - ;; + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) - set_cc_for_build + eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -218,72 +182,43 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in os=netbsd ;; esac - # Determine ABI tags. - case "$UNAME_MACHINE_ARCH" in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` - ;; - esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "$UNAME_VERSION" in + case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) - release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "$machine-${os}${release}${abi-}" + echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" - exit ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" - exit ;; - *:MidnightBSD:*:*) - echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) - echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) - echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" - exit ;; - *:OS108:*:*) - echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) - echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" - exit ;; - *:Sortix:*:*) - echo "$UNAME_MACHINE"-unknown-sortix - exit ;; - *:Twizzler:*:*) - echo "$UNAME_MACHINE"-unknown-twizzler - exit ;; - *:Redox:*:*) - echo "$UNAME_MACHINE"-unknown-redox - exit ;; - mips:OSF1:*.*) - echo mips-dec-osf1 + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in @@ -301,54 +236,63 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") - UNAME_MACHINE=alpha ;; + UNAME_MACHINE="alpha" ;; "EV5 (21164)") - UNAME_MACHINE=alphaev5 ;; + UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") - UNAME_MACHINE=alphaev56 ;; + UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") - UNAME_MACHINE=alphapca56 ;; + UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") - UNAME_MACHINE=alphapca57 ;; + UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") - UNAME_MACHINE=alphaev6 ;; + UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") - UNAME_MACHINE=alphaev67 ;; + UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") - UNAME_MACHINE=alphaev68 ;; + UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE=alphaev69 ;; + UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") - UNAME_MACHINE=alphaev7 ;; + UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") - UNAME_MACHINE=alphaev79 ;; + UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-amigaos + echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) - echo "$UNAME_MACHINE"-unknown-morphos + echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition @@ -360,7 +304,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix"$UNAME_RELEASE" + echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos @@ -387,38 +331,38 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux"$UNAME_RELEASE" + echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - set_cc_for_build - SUN_ARCH=i386 + eval $set_cc_for_build + SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH=x86_64 + SUN_ARCH="x86_64" fi fi - echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in @@ -427,25 +371,25 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos"$UNAME_RELEASE" + echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) - echo m68k-sun-sunos"$UNAME_RELEASE" + echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) - echo sparc-sun-sunos"$UNAME_RELEASE" + echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos"$UNAME_RELEASE" + echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not @@ -456,44 +400,44 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" + echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" + echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint"$UNAME_RELEASE" + echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint"$UNAME_RELEASE" + echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint"$UNAME_RELEASE" + echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint"$UNAME_RELEASE" + echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) - echo m68k-apple-machten"$UNAME_RELEASE" + echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) - echo powerpc-apple-machten"$UNAME_RELEASE" + echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix"$UNAME_RELEASE" + echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix"$UNAME_RELEASE" + echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix"$UNAME_RELEASE" + echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -502,23 +446,23 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && - dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`"$dummy" "$dummyarg"` && + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos"$UNAME_RELEASE" + echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax @@ -544,17 +488,17 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then - if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ - [ "$TARGET_BINARY_INTERFACE"x = x ] + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] then - echo m88k-dg-dgux"$UNAME_RELEASE" + echo m88k-dg-dgux${UNAME_RELEASE} else - echo m88k-dg-dguxbcs"$UNAME_RELEASE" + echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else - echo i586-dg-dgux"$UNAME_RELEASE" + echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) @@ -571,7 +515,7 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id @@ -583,14 +527,14 @@ EOF if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi - echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #include main() @@ -601,7 +545,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else @@ -615,27 +559,26 @@ EOF exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` else - IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi - echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx @@ -650,28 +593,28 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - case "$UNAME_MACHINE" in - 9000/31?) HP_ARCH=m68000 ;; - 9000/[34]??) HP_ARCH=m68k ;; + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "$sc_cpu_version" in - 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 - 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "$sc_kernel_bits" in - 32) HP_ARCH=hppa2.0n ;; - 64) HP_ARCH=hppa2.0w ;; - '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi - if [ "$HP_ARCH" = "" ]; then - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include @@ -704,13 +647,13 @@ EOF exit (0); } EOF - (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ "$HP_ARCH" = hppa2.0w ] + if [ ${HP_ARCH} = "hppa2.0w" ] then - set_cc_for_build + eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -721,23 +664,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH=hppa2.0w + HP_ARCH="hppa2.0w" else - HP_ARCH=hppa64 + HP_ARCH="hppa64" fi fi - echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux"$HPUX_REV" + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) - set_cc_for_build - sed 's/^ //' << EOF > "$dummy.c" + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #include int main () @@ -762,11 +705,11 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -775,7 +718,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -783,9 +726,9 @@ EOF exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then - echo "$UNAME_MACHINE"-unknown-osf1mk + echo ${UNAME_MACHINE}-unknown-osf1mk else - echo "$UNAME_MACHINE"-unknown-osf1 + echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) @@ -810,123 +753,130 @@ EOF echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) - echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` - FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi"$UNAME_RELEASE" + echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) - echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" - exit ;; - arm:FreeBSD:*:*) - UNAME_PROCESSOR=`uname -p` - set_cc_for_build - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi - else - echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf - fi + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case "$UNAME_PROCESSOR" in + case ${UNAME_PROCESSOR} in amd64) - UNAME_PROCESSOR=x86_64 ;; - i386) - UNAME_PROCESSOR=i586 ;; + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac - echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) - echo "$UNAME_MACHINE"-pc-cygwin + echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) - echo "$UNAME_MACHINE"-pc-mingw64 + echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) - echo "$UNAME_MACHINE"-pc-mingw32 + echo ${UNAME_MACHINE}-pc-mingw32 exit ;; - *:MSYS*:*) - echo "$UNAME_MACHINE"-pc-msys + i*:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) - echo "$UNAME_MACHINE"-pc-pw32 + echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) - case "$UNAME_MACHINE" in + case ${UNAME_MACHINE} in x86) - echo i586-pc-interix"$UNAME_RELEASE" + echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix"$UNAME_RELEASE" + echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) - echo ia64-unknown-interix"$UNAME_RELEASE" + echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; i*:UWIN*:*) - echo "$UNAME_MACHINE"-pc-uwin + echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-pc-cygwin + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system - echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; - *:Minix:*:*) - echo "$UNAME_MACHINE"-unknown-minix + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -936,169 +886,125 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC=gnulibc1 ; fi - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; arm*:Linux:*:*) - set_cc_for_build + eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + echo ${UNAME_MACHINE}-unknown-linux-gnueabi else - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + echo ${UNAME_MACHINE}-unknown-linux-gnueabihf fi fi exit ;; avr32*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; crisv32:Linux:*:*) - echo "$UNAME_MACHINE"-axis-linux-"$LIBC" - exit ;; - e2k:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-axis-linux-gnu exit ;; frv:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; hexagon:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit ;; ia64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - k1om:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:* | mips64:Linux:*:*) - set_cc_for_build - IS_GLIBC=0 - test x"${LIBC}" = xgnu && IS_GLIBC=1 - sed 's/^ //' << EOF > "$dummy.c" + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c #undef CPU - #undef mips - #undef mipsel - #undef mips64 - #undef mips64el - #if ${IS_GLIBC} && defined(_ABI64) - LIBCABI=gnuabi64 - #else - #if ${IS_GLIBC} && defined(_ABIN32) - LIBCABI=gnuabin32 - #else - LIBCABI=${LIBC} - #endif - #endif - - #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa64r6 - #else - #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 - CPU=mipsisa32r6 - #else - #if defined(__mips64) - CPU=mips64 - #else - CPU=mips - #endif - #endif - #endif - + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - MIPS_ENDIAN=el + CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - MIPS_ENDIAN= + CPU=${UNAME_MACHINE} #else - MIPS_ENDIAN= + CPU= #endif #endif EOF - eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" - test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; - mips64el:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" - exit ;; - openrisc*:Linux:*:*) - echo or1k-unknown-linux-"$LIBC" - exit ;; - or32:Linux:*:* | or1k*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + or32:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-"$LIBC" + echo sparc-unknown-linux-gnu exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-"$LIBC" + echo hppa64-unknown-linux-gnu exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; - PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; - *) echo hppa-unknown-linux-"$LIBC" ;; + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-"$LIBC" + echo powerpc64-unknown-linux-gnu exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-"$LIBC" - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-"$LIBC" - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-"$LIBC" - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo powerpc-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; tile*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) - echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) - echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) - echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1112,34 +1018,34 @@ EOF # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo "$UNAME_MACHINE"-pc-os2-emx + echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) - echo "$UNAME_MACHINE"-unknown-stop + echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) - echo "$UNAME_MACHINE"-unknown-atheos + echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) - echo "$UNAME_MACHINE"-pc-syllable + echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos"$UNAME_RELEASE" + echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) - echo "$UNAME_MACHINE"-pc-msdosdjgpp + echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; - i*86:*:4.*:*) - UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else - echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) @@ -1149,12 +1055,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1164,9 +1070,9 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else - echo "$UNAME_MACHINE"-pc-sysv32 + echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) @@ -1174,7 +1080,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configure will decide that + # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1186,9 +1092,9 @@ EOF exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) @@ -1208,9 +1114,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1219,28 +1125,28 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos"$UNAME_RELEASE" + echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos"$UNAME_RELEASE" + echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos"$UNAME_RELEASE" + echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos"$UNAME_RELEASE" + echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv"$UNAME_RELEASE" + echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 @@ -1251,7 +1157,7 @@ EOF *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo "$UNAME_MACHINE"-sni-sysv4 + echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi @@ -1271,23 +1177,23 @@ EOF exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo "$UNAME_MACHINE"-stratus-vos + echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) - echo m68k-apple-aux"$UNAME_RELEASE" + echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv"$UNAME_RELEASE" + echo mips-nec-sysv${UNAME_RELEASE} else - echo mips-unknown-sysv"$UNAME_RELEASE" + echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. @@ -1306,94 +1212,65 @@ EOF echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux"$UNAME_RELEASE" + echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux"$UNAME_RELEASE" + echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux"$UNAME_RELEASE" + echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux"$UNAME_RELEASE" + echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux"$UNAME_RELEASE" + echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux"$UNAME_RELEASE" - exit ;; - SX-ACE:SUPER-UX:*:*) - echo sxace-nec-superux"$UNAME_RELEASE" + echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody"$UNAME_RELEASE" + echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) - echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac - if command -v xcode-select > /dev/null 2> /dev/null && \ - ! xcode-select --print-path > /dev/null 2> /dev/null ; then - # Avoid executing cc if there is no toolchain installed as - # cc will be a stub that puts up a graphical alert - # prompting the user to install developer tools. - CC_FOR_BUILD=no_compiler_found - else - set_cc_for_build - fi - if [ "$CC_FOR_BUILD" != no_compiler_found ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc - if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_PPC >/dev/null - then - UNAME_PROCESSOR=powerpc - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # uname -m returns i386 or x86_64 - UNAME_PROCESSOR=$UNAME_MACHINE - fi - echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = x86; then + if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk"$UNAME_RELEASE" + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk"$UNAME_RELEASE" + echo nse-tandem-nsk${UNAME_RELEASE} exit ;; - NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSV-*:NONSTOP_KERNEL:*:*) - echo nsv-tandem-nsk"$UNAME_RELEASE" - exit ;; - NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-tandem-nsk"$UNAME_RELEASE" + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux @@ -1402,19 +1279,18 @@ EOF echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) - echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - # shellcheck disable=SC2154 - if test "$cputype" = 386; then + if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi - echo "$UNAME_MACHINE"-unknown-plan9 + echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 @@ -1435,14 +1311,14 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux"$UNAME_RELEASE" + echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) - echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "$UNAME_MACHINE" in + case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; @@ -1451,39 +1327,24 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) - echo "$UNAME_MACHINE"-pc-rdos + echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) - echo "$UNAME_MACHINE"-pc-aros + echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) - echo "$UNAME_MACHINE"-unknown-esx - exit ;; - amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; - *:Unleashed:*:*) - echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + echo ${UNAME_MACHINE}-unknown-esx exit ;; esac -# No uname command or uname output not recognized. -set_cc_for_build -cat > "$dummy.c" <$dummy.c < -#include -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#include -#if defined(_SIZE_T_) || defined(SIGLOST) -#include -#endif -#endif +# include +# include #endif main () { @@ -1496,14 +1357,22 @@ main () #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" + "" #endif - ); exit (0); + ); exit (0); #endif #endif +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" @@ -1543,54 +1412,39 @@ main () #endif #if defined (_SEQUENT_) - struct utsname un; + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); - uname(&un); - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) -#if !defined (ultrix) -#include -#if defined (BSD) -#if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -#else -#if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#endif -#else - printf ("vax-dec-bsd\n"); exit (0); -#endif -#else -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname un; - uname (&un); - printf ("vax-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("vax-dec-ultrix\n"); exit (0); -#endif -#endif -#endif -#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) -#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) -#if defined(_SIZE_T_) || defined(SIGLOST) - struct utsname *un; - uname (&un); - printf ("mips-dec-ultrix%s\n", un.release); exit (0); -#else - printf ("mips-dec-ultrix\n"); exit (0); -#endif -#endif +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif #endif #if defined (alliant) && defined (i860) @@ -1601,44 +1455,54 @@ main () } EOF -$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. -test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } -echo "$0: unable to guess system type" >&2 +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } -case "$UNAME_MACHINE:$UNAME_SYSTEM" in - mips:Linux | mips64:Linux) - # If we got here on MIPS GNU/Linux, output extra information. - cat >&2 <&2 <&2 < in order to provide the needed +information to handle your system. config.guess timestamp = $timestamp @@ -1657,17 +1521,16 @@ hostinfo = `(hostinfo) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = "$UNAME_MACHINE" -UNAME_RELEASE = "$UNAME_RELEASE" -UNAME_SYSTEM = "$UNAME_SYSTEM" -UNAME_VERSION = "$UNAME_VERSION" +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} EOF -fi exit 1 # Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) +# eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/config.sub b/config.sub index 973a2980a..89b128630 100755 --- a/config.sub +++ b/config.sub @@ -1,31 +1,36 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright 1992-2020 Free Software Foundation, Inc. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, +# 2011, 2012 Free Software Foundation, Inc. -timestamp='2020-05-04' +timestamp='2012-10-10' -# This file is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 3 of the License, or +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# General Public License for more details. +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that -# program. This Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). +# the same distribution terms that you use for the rest of that program. -# Please send patches to . +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -33,7 +38,7 @@ timestamp='2020-05-04' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -53,11 +58,12 @@ timestamp='2020-05-04' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS Canonicalize a configuration name. -Options: +Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -67,7 +73,9 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright 1992-2020 Free Software Foundation, Inc. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 +Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -89,12 +97,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" >&2 + echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. - echo "$1" + echo $1 exit ;; * ) @@ -110,1164 +118,1203 @@ case $# in exit 1;; esac -# Split fields of configuration type -# shellcheck disable=SC2162 -IFS="-" read field1 field2 field3 field4 <&2 - exit 1 +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. ;; - *-*-*-*) - basic_machine=$field1-$field2 - os=$field3-$field4 + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 ;; - *-*-*) - # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two - # parts - maybe_os=$field2-$field3 - case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ - | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ - | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ - | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ - | storm-chaos* | os2-emx* | rtmk-nova*) - basic_machine=$field1 - os=$maybe_os - ;; - android-linux) - basic_machine=$field1-unknown - os=linux-android - ;; - *) - basic_machine=$field1-$field2 - os=$field3 - ;; - esac + -bluegene*) + os=-cnk ;; - *-*) - # A lone config we happen to match not fitting any pattern - case $field1-$field2 in - decstation-3100) - basic_machine=mips-dec - os= - ;; - *-*) - # Second component is usually, but not always the OS - case $field2 in - # Prevent following clause from handling this valid os - sun*os*) - basic_machine=$field1 - os=$field2 - ;; - # Manufacturers - dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ - | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ - | unicom* | ibm* | next | hp | isi* | apollo | altos* \ - | convergent* | ncr* | news | 32* | 3600* | 3100* \ - | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ - | ultra | tti* | harris | dolphin | highlevel | gould \ - | cbm | ns | masscomp | apple | axis | knuth | cray \ - | microblaze* | sim | cisco \ - | oki | wec | wrs | winbond) - basic_machine=$field1-$field2 - os= - ;; - *) - basic_machine=$field1 - os=$field2 - ;; - esac - ;; - esac + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 ;; - *) - # Convert single-component short-hands not valid as part of - # multi-component configurations. - case $field1 in - 386bsd) - basic_machine=i386-pc - os=bsd - ;; - a29khif) - basic_machine=a29k-amd - os=udi - ;; - adobe68k) - basic_machine=m68010-adobe - os=scout - ;; - alliant) - basic_machine=fx80-alliant - os= - ;; - altos | altos3068) - basic_machine=m68k-altos - os= - ;; - am29k) - basic_machine=a29k-none - os=bsd - ;; - amdahl) - basic_machine=580-amdahl - os=sysv - ;; - amiga) - basic_machine=m68k-unknown - os= - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=bsd - ;; - aros) - basic_machine=i386-pc - os=aros - ;; - aux) - basic_machine=m68k-apple - os=aux - ;; - balance) - basic_machine=ns32k-sequent - os=dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=linux - ;; - cegcc) - basic_machine=arm-unknown - os=cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=bsd - ;; - convex-c2) - basic_machine=c2-convex - os=bsd - ;; - convex-c32) - basic_machine=c32-convex - os=bsd - ;; - convex-c34) - basic_machine=c34-convex - os=bsd - ;; - convex-c38) - basic_machine=c38-convex - os=bsd - ;; - cray) - basic_machine=j90-cray - os=unicos - ;; - crds | unos) - basic_machine=m68k-crds - os= - ;; - da30) - basic_machine=m68k-da30 - os= - ;; - decstation | pmax | pmin | dec3100 | decstatn) - basic_machine=mips-dec - os= - ;; - delta88) - basic_machine=m88k-motorola - os=sysv3 - ;; - dicos) - basic_machine=i686-pc - os=dicos - ;; - djgpp) - basic_machine=i586-pc - os=msdosdjgpp - ;; - ebmon29k) - basic_machine=a29k-amd - os=ebmon - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=ose - ;; - gmicro) - basic_machine=tron-gmicro - os=sysv - ;; - go32) - basic_machine=i386-pc - os=go32 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=hms - ;; - harris) - basic_machine=m88k-harris - os=sysv3 - ;; - hp300 | hp300hpux) - basic_machine=m68k-hp - os=hpux - ;; - hp300bsd) - basic_machine=m68k-hp - os=bsd - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=proelf - ;; - i386mach) - basic_machine=i386-mach - os=mach - ;; - isi68 | isi) - basic_machine=m68k-isi - os=sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=linux - ;; - magnum | m3230) - basic_machine=mips-mips - os=sysv - ;; - merlin) - basic_machine=ns32k-utek - os=sysv - ;; - mingw64) - basic_machine=x86_64-pc - os=mingw64 - ;; - mingw32) - basic_machine=i686-pc - os=mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=mingw32ce - ;; - monitor) - basic_machine=m68k-rom68k - os=coff - ;; - morphos) - basic_machine=powerpc-unknown - os=morphos - ;; - moxiebox) - basic_machine=moxie-unknown - os=moxiebox - ;; - msdos) - basic_machine=i386-pc - os=msdos - ;; - msys) - basic_machine=i686-pc - os=msys - ;; - mvs) - basic_machine=i370-ibm - os=mvs - ;; - nacl) - basic_machine=le32-unknown - os=nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=sysv4 - ;; - netbsd386) - basic_machine=i386-pc - os=netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=newsos - ;; - news1000) - basic_machine=m68030-sony - os=newsos - ;; - necv70) - basic_machine=v70-nec - os=sysv - ;; - nh3000) - basic_machine=m68k-harris - os=cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=cxux - ;; - nindy960) - basic_machine=i960-intel - os=nindy - ;; - mon960) - basic_machine=i960-intel - os=mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=nonstopux - ;; - os400) - basic_machine=powerpc-ibm - os=os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=ose - ;; - os68k) - basic_machine=m68k-none - os=os68k - ;; - paragon) - basic_machine=i860-intel - os=osf - ;; - parisc) - basic_machine=hppa-unknown - os=linux - ;; - pw32) - basic_machine=i586-unknown - os=pw32 - ;; - rdos | rdos64) - basic_machine=x86_64-pc - os=rdos - ;; - rdos32) - basic_machine=i386-pc - os=rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=coff - ;; - sa29200) - basic_machine=a29k-amd - os=udi - ;; - sei) - basic_machine=mips-sei - os=seiux - ;; - sequent) - basic_machine=i386-sequent - os= - ;; - sps7) - basic_machine=m68k-bull - os=sysv2 - ;; - st2000) - basic_machine=m68k-tandem - os= - ;; - stratus) - basic_machine=i860-stratus - os=sysv4 - ;; - sun2) - basic_machine=m68000-sun - os= - ;; - sun2os3) - basic_machine=m68000-sun - os=sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=sunos4 - ;; - sun3) - basic_machine=m68k-sun - os= - ;; - sun3os3) - basic_machine=m68k-sun - os=sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=sunos4 - ;; - sun4) - basic_machine=sparc-sun - os= - ;; - sun4os3) - basic_machine=sparc-sun - os=sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=solaris2 - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - os= - ;; - sv1) - basic_machine=sv1-cray - os=unicos - ;; - symmetry) - basic_machine=i386-sequent - os=dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=unicos - ;; - t90) - basic_machine=t90-cray - os=unicos - ;; - toad1) - basic_machine=pdp10-xkl - os=tops20 - ;; - tpf) - basic_machine=s390x-ibm - os=tpf - ;; - udi29k) - basic_machine=a29k-amd - os=udi - ;; - ultra3) - basic_machine=a29k-nyu - os=sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=none - ;; - vaxv) - basic_machine=vax-dec - os=sysv - ;; - vms) - basic_machine=vax-dec - os=vms - ;; - vsta) - basic_machine=i386-pc - os=vsta - ;; - vxworks960) - basic_machine=i960-wrs - os=vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=vxworks - ;; - xbox) - basic_machine=i686-pc - os=mingw32 - ;; - ymp) - basic_machine=ymp-cray - os=unicos - ;; - *) - basic_machine=$1 - os= - ;; - esac + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint ;; esac -# Decode 1-component or ad-hoc basic machines +# Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in - # Here we handle the default manufacturer of certain CPU types. It is in - # some cases the only manufacturer, in others, it is the most popular. - w89k) - cpu=hppa1.1 - vendor=winbond + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | be32 | be64 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | epiphany \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 \ + | ns16k | ns32k \ + | open8 \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pyramid \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown ;; - op50n) - cpu=hppa1.1 - vendor=oki + c54x) + basic_machine=tic54x-unknown ;; - op60c) - cpu=hppa1.1 - vendor=oki + c55x) + basic_machine=tic55x-unknown ;; - ibm*) - cpu=i370 - vendor=ibm + c6x) + basic_machine=tic6x-unknown ;; - orion105) - cpu=clipper - vendor=highlevel + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) + basic_machine=$basic_machine-unknown + os=-none ;; - mac | mpw | mac-mpw) - cpu=m68k - vendor=apple + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; - pmac | pmac-mpw) - cpu=powerpc - vendor=apple + ms1) + basic_machine=mt-unknown ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - cpu=m68000 - vendor=att + strongarm | thumb | xscale) + basic_machine=arm-unknown ;; - 3b*) - cpu=we32k - vendor=att + xgate) + basic_machine=$basic_machine-unknown + os=-none ;; - bluegene*) - cpu=powerpc - vendor=ibm - os=cnk - ;; - decsystem10* | dec10*) - cpu=pdp10 - vendor=dec - os=tops10 - ;; - decsystem20* | dec20*) - cpu=pdp10 - vendor=dec - os=tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - cpu=m68k - vendor=motorola - ;; - dpx2*) - cpu=m68k - vendor=bull - os=sysv3 - ;; - encore | umax | mmax) - cpu=ns32k - vendor=encore - ;; - elxsi) - cpu=elxsi - vendor=elxsi - os=${os:-bsd} - ;; - fx2800) - cpu=i860 - vendor=alliant - ;; - genix) - cpu=ns32k - vendor=ns - ;; - h3050r* | hiux*) - cpu=hppa1.1 - vendor=hitachi - os=hiuxwe2 - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - cpu=m68000 - vendor=hp - ;; - hp9k3[2-9][0-9]) - cpu=m68k - vendor=hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - cpu=hppa1.1 - vendor=hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - cpu=hppa1.0 - vendor=hp - ;; - i*86v32) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - os=sysv32 - ;; - i*86v4*) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - os=sysv4 - ;; - i*86v) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - os=sysv - ;; - i*86sol2) - cpu=`echo "$1" | sed -e 's/86.*/86/'` - vendor=pc - os=solaris2 - ;; - j90 | j90-cray) - cpu=j90 - vendor=cray - os=${os:-unicos} - ;; - iris | iris4d) - cpu=mips - vendor=sgi - case $os in - irix*) - ;; - *) - os=irix4 - ;; - esac - ;; - miniframe) - cpu=m68000 - vendor=convergent - ;; - *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) - cpu=m68k - vendor=atari - os=mint - ;; - news-3600 | risc-news) - cpu=mips - vendor=sony - os=newsos - ;; - next | m*-next) - cpu=m68k - vendor=next - case $os in - openstep*) - ;; - nextstep*) - ;; - ns2*) - os=nextstep2 - ;; - *) - os=nextstep3 - ;; - esac - ;; - np1) - cpu=np1 - vendor=gould - ;; - op50n-* | op60c-*) - cpu=hppa1.1 - vendor=oki - os=proelf - ;; - pa-hitachi) - cpu=hppa1.1 - vendor=hitachi - os=hiuxwe2 - ;; - pbd) - cpu=sparc - vendor=tti - ;; - pbb) - cpu=m68k - vendor=tti - ;; - pc532) - cpu=ns32k - vendor=pc532 - ;; - pn) - cpu=pn - vendor=gould - ;; - power) - cpu=power - vendor=ibm - ;; - ps2) - cpu=i386 - vendor=ibm - ;; - rm[46]00) - cpu=mips - vendor=siemens - ;; - rtpc | rtpc-*) - cpu=romp - vendor=ibm - ;; - sde) - cpu=mipsisa32 - vendor=sde - os=${os:-elf} - ;; - simso-wrs) - cpu=sparclite - vendor=wrs - os=vxworks - ;; - tower | tower-32) - cpu=m68k - vendor=ncr - ;; - vpp*|vx|vx-*) - cpu=f301 - vendor=fujitsu - ;; - w65) - cpu=w65 - vendor=wdc - ;; - w89k-*) - cpu=hppa1.1 - vendor=winbond - os=proelf - ;; - none) - cpu=none - vendor=none - ;; - leon|leon[3-9]) - cpu=sparc - vendor=$basic_machine - ;; - leon-*|leon[3-9]-*) - cpu=sparc - vendor=`echo "$basic_machine" | sed 's/-.*//'` + xscaleeb) + basic_machine=armeb-unknown ;; - *-*) - # shellcheck disable=SC2162 - IFS="-" read cpu vendor <&2 + exit 1 ;; - # These rules are duplicated from below for sake of the special case above; - # i.e. things that normalized to x86 arches should also default to "pc" - pc98) - cpu=i386 - vendor=pc + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pyramid-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) ;; - x64 | amd64) - cpu=x86_64 - vendor=pc + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown ;; - # Recognize the basic CPU types without company name. - *) - cpu=$basic_machine - vendor=unknown + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd ;; -esac - -unset -v basic_machine - -# Decode basic machines in the full and proper CPU-Company form. -case $cpu-$vendor in - # Here we handle the default manufacturer of certain CPU types in canonical form. It is in - # some cases the only manufacturer, in others, it is the most popular. - craynv-unknown) - vendor=cray - os=${os:-unicosmp} + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att ;; - c90-unknown | c90-cray) - vendor=cray - os=${os:-unicos} + 3b*) + basic_machine=we32k-att ;; - fx80-unknown) - vendor=alliant + a29khif) + basic_machine=a29k-amd + os=-udi ;; - romp-unknown) - vendor=ibm + abacus) + basic_machine=abacus-unknown ;; - mmix-unknown) - vendor=knuth + adobe68k) + basic_machine=m68010-adobe + os=-scout ;; - microblaze-unknown | microblazeel-unknown) - vendor=xilinx + alliant | fx80) + basic_machine=fx80-alliant ;; - rs6000-unknown) - vendor=ibm + altos | altos3068) + basic_machine=m68k-altos ;; - vax-unknown) - vendor=dec + am29k) + basic_machine=a29k-none + os=-bsd ;; - pdp11-unknown) - vendor=dec + amd64) + basic_machine=x86_64-pc ;; - we32k-unknown) - vendor=att - ;; - cydra-unknown) - vendor=cydrome - ;; - i370-ibm*) - vendor=ibm - ;; - orion-unknown) - vendor=highlevel - ;; - xps-unknown | xps100-unknown) - cpu=xps100 - vendor=honeywell - ;; - - # Here we normalize CPU types with a missing or matching vendor - dpx20-unknown | dpx20-bull) - cpu=rs6000 - vendor=bull - os=${os:-bosx} - ;; - - # Here we normalize CPU types irrespective of the vendor amd64-*) - cpu=x86_64 + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux ;; blackfin-*) - cpu=bfin - os=linux + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk ;; c54x-*) - cpu=tic54x + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c55x-*) - cpu=tic55x + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; c6x-*) - cpu=tic6x + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` ;; - e500v[12]-*) - cpu=powerpc - os=$os"spe" + c90) + basic_machine=c90-cray + os=-unicos ;; - mips3*-*) - cpu=mips64 + cegcc) + basic_machine=arm-unknown + os=-cegcc ;; - ms1-*) - cpu=mt + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux ;; m68knommu-*) - cpu=m68k - os=linux + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux ;; - m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) - cpu=s12z + m88k-omron*) + basic_machine=m88k-omron ;; - openrisc-*) - cpu=or32 + magnum | m3230) + basic_machine=mips-mips + os=-sysv ;; - parisc-*) - cpu=hppa - os=linux + merlin) + basic_machine=ns32k-utek + os=-sysv ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - cpu=i586 + microblaze*) + basic_machine=microblaze-xilinx ;; - pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) - cpu=i686 + mingw64) + basic_machine=x86_64-pc + os=-mingw64 ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - cpu=i686 + mingw32) + basic_machine=i386-pc + os=-mingw32 ;; - pentium4-*) - cpu=i786 + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce ;; - pc98-*) - cpu=i386 + miniframe) + basic_machine=m68000-convergent ;; - ppc-* | ppcbe-*) - cpu=powerpc + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint ;; - ppcle-* | powerpclittle-*) - cpu=powerpcle + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; - ppc64-*) - cpu=powerpc64 + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; - ppc64le-* | powerpc64little-*) - cpu=powerpc64le + monitor) + basic_machine=m68k-rom68k + os=-coff ;; - sb1-*) - cpu=mipsisa64sb1 + morphos) + basic_machine=powerpc-unknown + os=-morphos ;; - sb1el-*) - cpu=mipsisa64sb1el + msdos) + basic_machine=i386-pc + os=-msdos ;; - sh5e[lb]-*) - cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; - spur-*) - cpu=spur + msys) + basic_machine=i386-pc + os=-msys ;; - strongarm-* | thumb-*) - cpu=arm + mvs) + basic_machine=i370-ibm + os=-mvs ;; - tx39-*) - cpu=mipstx39 + nacl) + basic_machine=le32-unknown + os=-nacl ;; - tx39el-*) - cpu=mipstx39el + ncr3000) + basic_machine=i486-ncr + os=-sysv4 ;; - x64-*) - cpu=x86_64 + netbsd386) + basic_machine=i386-unknown + os=-netbsd ;; - xscale-* | xscalee[bl]-*) - cpu=`echo "$cpu" | sed 's/^xscale/arm/'` + netwinder) + basic_machine=armv4l-rebel + os=-linux ;; - - # Recognize the canonical CPU Types that limit and/or modify the - # company names they are paired with. - cr16-*) - os=${os:-elf} + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos ;; - crisv32-* | etraxfs*-*) - cpu=crisv32 - vendor=axis + news1000) + basic_machine=m68030-sony + os=-newsos ;; - cris-* | etrax*-*) - cpu=cris - vendor=axis + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos ;; - crx-*) - os=${os:-elf} + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould ;; neo-tandem) - cpu=neo - vendor=tandem + basic_machine=neo-tandem ;; nse-tandem) - cpu=nse - vendor=tandem + basic_machine=nse-tandem ;; nsr-tandem) - cpu=nsr - vendor=tandem + basic_machine=nsr-tandem ;; - nsv-tandem) - cpu=nsv - vendor=tandem + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf ;; - nsx-tandem) - cpu=nsx - vendor=tandem + openrisc | openrisc-*) + basic_machine=or32-unknown ;; - s390-*) - cpu=s390 - vendor=ibm + os400) + basic_machine=powerpc-ibm + os=-os400 ;; - s390x-*) - cpu=s390x - vendor=ibm + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose ;; - tile*-*) - os=${os:-linux-gnu} + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none ;; +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; *) - # Recognize the canonical CPU types that are allowed with any - # company name. - case $cpu in - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | abacus \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ - | alphapca5[67] | alpha64pca5[67] \ - | am33_2.0 \ - | amdgcn \ - | arc | arceb \ - | arm | arm[lb]e | arme[lb] | armv* \ - | avr | avr32 \ - | asmjs \ - | ba \ - | be32 | be64 \ - | bfin | bpf | bs2000 \ - | c[123]* | c30 | [cjt]90 | c4x \ - | c8051 | clipper | craynv | csky | cydra \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | elxsi | epiphany \ - | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ - | h8300 | h8500 \ - | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i*86 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle \ - | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ - | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ - | m88110 | m88k | maxq | mb | mcore | mep | metag \ - | microblaze | microblazeel \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64eb | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mmix \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nfp \ - | nios | nios2 | nios2eb | nios2el \ - | none | np1 | ns16k | ns32k | nvptx \ - | open8 \ - | or1k* \ - | or32 \ - | orion \ - | picochip \ - | pdp10 | pdp11 | pj | pjl | pn | power \ - | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ - | pru \ - | pyramid \ - | riscv | riscv32 | riscv64 \ - | rl78 | romp | rs6000 | rx \ - | score \ - | sh | shl \ - | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ - | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ - | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ - | spu \ - | tahoe \ - | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ - | tron \ - | ubicom32 \ - | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ - | vax \ - | visium \ - | w65 \ - | wasm32 | wasm64 \ - | we32k \ - | x86 | x86_64 | xc16x | xgate | xps100 \ - | xstormy16 | xtensa* \ - | ymp \ - | z8k | z80) - ;; - - *) - echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 - exit 1 - ;; - esac + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. -case $vendor in - digital*) - vendor=dec +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; - commodore*) - vendor=cbm + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; @@ -1275,244 +1322,200 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x$os != x ] +if [ x"$os" != x"" ] then case $os in - # First match some system type aliases that might get confused - # with valid system types. - # solaris* is a basic system type, with this one exception. - auroraux) - os=auroraux + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux ;; - bluegene*) - os=cnk - ;; - solaris1 | solaris1.*) + -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; - solaris) - os=solaris2 + -solaris) + os=-solaris2 ;; - unixware*) - os=sysv4.2uw + -svr4*) + os=-sysv4 ;; - gnu/linux*) + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # es1800 is here to avoid being matched by es* (a different OS) - es1800*) - os=ose - ;; - # Some version numbers need modification - chorusos*) - os=chorusos - ;; - isc) - os=isc2.2 - ;; - sco6) - os=sco5v6 - ;; - sco5) - os=sco3.2v5 - ;; - sco4) - os=sco3.2v4 - ;; - sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - ;; - sco3.2v[4-9]* | sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - ;; - scout) - # Don't match below - ;; - sco*) - os=sco3.2v2 - ;; - psos*) - os=psos - ;; - # Now accept the basic system types. + # First accept the basic system types. # The portable systems comes first. - # Each alternative MUST end in a * to match a version number. - # sysv* is not here because it comes later, after sysvr4. - gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ - | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | kopensolaris* | plan9* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* | twizzler* \ - | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ - | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ - | knetbsd* | mirbsd* | netbsd* \ - | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ - | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ - | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ - | chorusrdb* | cegcc* | glidix* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ - | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ - | linux-newlib* | linux-musl* | linux-uclibc* \ - | uxpv* | beos* | mpeix* | udk* | moxiebox* \ - | interix* | uwin* | mks* | rhapsody* | darwin* \ - | openstep* | oskit* | conix* | pw32* | nonstopux* \ - | storm-chaos* | tops10* | tenex* | tops20* | its* \ - | os2* | vos* | palmos* | uclinux* | nucleus* \ - | morphos* | superux* | rtmk* | windiss* \ - | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode*) + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) # Remember, each alternative MUST END IN *, to match a version number. ;; - qnx*) - case $cpu in - x86 | i*86) + -qnx*) + case $basic_machine in + x86-* | i*86-*) ;; *) - os=nto-$os + os=-nto$os ;; esac ;; - hiux*) - os=hiuxwe2 + -nto-qnx*) ;; - nto-qnx*) - ;; - nto*) + -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; - sim | xray | os68k* | v88r* \ - | windows* | osx | abug | netware* | os9* \ - | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; - linux-dietlibc) - os=linux-dietlibc + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` ;; - linux*) + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; - lynx*178) - os=lynxos178 + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; - lynx*5) - os=lynxos5 + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; - lynx*) - os=lynxos + -opened*) + os=-openedition ;; - mac*) - os=`echo "$os" | sed -e 's|mac|macos|'` + -os400*) + os=-os400 ;; - opened*) - os=openedition + -wince*) + os=-wince ;; - os400*) - os=os400 + -osfrose*) + os=-osfrose ;; - sunos5*) - os=`echo "$os" | sed -e 's|sunos5|solaris2|'` + -osf*) + os=-osf ;; - sunos6*) - os=`echo "$os" | sed -e 's|sunos6|solaris3|'` + -utek*) + os=-bsd ;; - wince*) - os=wince + -dynix*) + os=-bsd ;; - utek*) - os=bsd + -acis*) + os=-aos ;; - dynix*) - os=bsd + -atheos*) + os=-atheos ;; - acis*) - os=aos + -syllable*) + os=-syllable ;; - atheos*) - os=atheos + -386bsd) + os=-bsd ;; - syllable*) - os=syllable + -ctix* | -uts*) + os=-sysv ;; - 386bsd) - os=bsd + -nova*) + os=-rtmk-nova ;; - ctix* | uts*) - os=sysv + -ns2 ) + os=-nextstep2 ;; - nova*) - os=rtmk-nova - ;; - ns2) - os=nextstep2 + -nsk*) + os=-nsk ;; # Preserve the version number of sinix5. - sinix5.*) + -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; - sinix*) - os=sysv4 + -sinix*) + os=-sysv4 ;; - tpf*) - os=tpf + -tpf*) + os=-tpf ;; - triton*) - os=sysv3 + -triton*) + os=-sysv3 ;; - oss*) - os=sysv3 + -oss*) + os=-sysv3 ;; - svr4*) - os=sysv4 + -svr4) + os=-sysv4 ;; - svr3) - os=sysv3 + -svr3) + os=-sysv3 ;; - sysvr4) - os=sysv4 + -sysvr4) + os=-sysv4 ;; - # This must come after sysvr4. - sysv*) + # This must come after -sysvr4. + -sysv*) ;; - ose*) - os=ose + -ose*) + os=-ose ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) - os=mint + -es1800*) + os=-ose ;; - zvmoe) - os=zvmoe + -xenix) + os=-xenix ;; - dicos*) - os=dicos + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint ;; - pikeos*) - # Until real need of OS specific support for - # particular features comes up, bare metal - # configurations are quite functional. - case $cpu in - arm*) - os=eabi - ;; - *) - os=elf - ;; - esac + -aros*) + os=-aros ;; - nacl*) + -kaos*) + os=-kaos ;; - ios) + -zvmoe) + os=-zvmoe ;; - none) + -dicos*) + os=-dicos ;; - *-eabi) + -nacl*) + ;; + -none) ;; *) - echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac @@ -1528,265 +1531,258 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $cpu-$vendor in +case $basic_machine in score-*) - os=elf + os=-elf ;; spu-*) - os=elf + os=-elf ;; *-acorn) - os=riscix1.2 + os=-riscix1.2 ;; arm*-rebel) - os=linux + os=-linux ;; arm*-semi) - os=aout + os=-aout ;; c4x-* | tic4x-*) - os=coff - ;; - c8051-*) - os=elf - ;; - clipper-intergraph) - os=clix + os=-coff ;; hexagon-*) - os=elf + os=-elf ;; tic54x-*) - os=coff + os=-coff ;; tic55x-*) - os=coff + os=-coff ;; tic6x-*) - os=coff + os=-coff ;; # This must come before the *-dec entry. pdp10-*) - os=tops20 + os=-tops20 ;; pdp11-*) - os=none + os=-none ;; *-dec | vax-*) - os=ultrix4.2 + os=-ultrix4.2 ;; m68*-apollo) - os=domain + os=-domain ;; i386-sun) - os=sunos4.0.2 + os=-sunos4.0.2 ;; m68000-sun) - os=sunos3 + os=-sunos3 ;; m68*-cisco) - os=aout + os=-aout ;; mep-*) - os=elf + os=-elf ;; mips*-cisco) - os=elf + os=-elf ;; mips*-*) - os=elf + os=-elf ;; or32-*) - os=coff + os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=sysv3 + os=-sysv3 ;; sparc-* | *-sun) - os=sunos4.1.1 - ;; - pru-*) - os=elf + os=-sunos4.1.1 ;; *-be) - os=beos + os=-beos + ;; + *-haiku) + os=-haiku ;; *-ibm) - os=aix + os=-aix ;; *-knuth) - os=mmixware + os=-mmixware ;; *-wec) - os=proelf + os=-proelf ;; *-winbond) - os=proelf + os=-proelf ;; *-oki) - os=proelf + os=-proelf ;; *-hp) - os=hpux + os=-hpux ;; *-hitachi) - os=hiux + os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=sysv + os=-sysv ;; *-cbm) - os=amigaos + os=-amigaos ;; *-dg) - os=dgux + os=-dgux ;; *-dolphin) - os=sysv3 + os=-sysv3 ;; m68k-ccur) - os=rtu + os=-rtu ;; m88k-omron*) - os=luna + os=-luna ;; - *-next) - os=nextstep + *-next ) + os=-nextstep ;; *-sequent) - os=ptx + os=-ptx ;; *-crds) - os=unos + os=-unos ;; *-ns) - os=genix + os=-genix ;; i370-*) - os=mvs + os=-mvs + ;; + *-next) + os=-nextstep3 ;; *-gould) - os=sysv + os=-sysv ;; *-highlevel) - os=bsd + os=-bsd ;; *-encore) - os=bsd + os=-bsd ;; *-sgi) - os=irix + os=-irix ;; *-siemens) - os=sysv4 + os=-sysv4 ;; *-masscomp) - os=rtu + os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=uxpv + os=-uxpv ;; *-rom68k) - os=coff + os=-coff ;; *-*bug) - os=coff + os=-coff ;; *-apple) - os=macos + os=-macos ;; *-atari*) - os=mint - ;; - *-wrs) - os=vxworks + os=-mint ;; *) - os=none + os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -case $vendor in - unknown) +vendor=unknown +case $basic_machine in + *-unknown) case $os in - riscix*) + -riscix*) vendor=acorn ;; - sunos*) + -sunos*) vendor=sun ;; - cnk*|-aix*) + -cnk*|-aix*) vendor=ibm ;; - beos*) + -beos*) vendor=be ;; - hpux*) + -hpux*) vendor=hp ;; - mpeix*) + -mpeix*) vendor=hp ;; - hiux*) + -hiux*) vendor=hitachi ;; - unos*) + -unos*) vendor=crds ;; - dgux*) + -dgux*) vendor=dg ;; - luna*) + -luna*) vendor=omron ;; - genix*) + -genix*) vendor=ns ;; - clix*) - vendor=intergraph - ;; - mvs* | opened*) + -mvs* | -opened*) vendor=ibm ;; - os400*) + -os400*) vendor=ibm ;; - ptx*) + -ptx*) vendor=sequent ;; - tpf*) + -tpf*) vendor=ibm ;; - vxsim* | vxworks* | windiss*) + -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; - aux*) + -aux*) vendor=apple ;; - hms*) + -hms*) vendor=hitachi ;; - mpw* | macos*) + -mpw* | -macos*) vendor=apple ;; - *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; - vos*) + -vos*) vendor=stratus ;; esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo "$cpu-$vendor-$os" +echo $basic_machine$os exit # Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) +# eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/install-sh b/install-sh index 377bb8687..ec298b537 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2011-11-20.07; # UTC +scriptversion=2020-11-14.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -41,19 +41,15 @@ scriptversion=2011-11-20.07; # UTC # This script is compatible with the BSD install script, but was written # from scratch. +tab=' ' nl=' ' -IFS=" "" $nl" +IFS=" $tab$nl" -# set DOITPROG to echo to test this script +# Set DOITPROG to "echo" to test this script. -# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi +doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -68,22 +64,16 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - posix_mkdir= # Desired mode of installed file. mode=0755 +# Create dirs (including intermediate dirs) using mode 755. +# This is like GNU 'install' as of coreutils 8.32 (2020). +mkdir_umask=22 + +backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -97,7 +87,7 @@ dir_arg= dst_arg= copy_on_change=false -no_target_directory= +is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -114,18 +104,28 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve the last data modification time) + -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. + -p pass -p to $cpprog. -s $stripprog installed files. + -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG + +By default, rm is invoked with -f; when overridden with RMPROG, +it's up to you to specify -f if you want it. + +If -S is not specified, no backups are attempted. + +Email bug reports to bug-automake@gnu.org. +Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,46 +137,62 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; + shift;; + + -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; - -t) dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; + -S) backupsuffix="$2" + shift;; - -T) no_target_directory=true;; + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -207,6 +223,15 @@ if test $# -eq 0; then exit 0 fi +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -223,16 +248,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -250,6 +275,10 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? + # Don't chown directories that already exist. + if test $dstdir_status = 0; then + chowncmd="" + fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -266,178 +295,148 @@ do fi dst=$dst_arg - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. + # If destination is a directory, append the input filename. if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst - dst=$dstdir/`basename "$src"` + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac dstdir_status=0 else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - + dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac + posix_mkdir=false + # The $RANDOM variable is not portable (e.g., dash). Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode + trap ' + ret=$? + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null + exit $ret + ' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p'. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else - mkdir_mode= + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; + trap '' 0;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else - # The umask is ridiculous, or mkdir does not conform to POSIX, + # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac - eval "$initialize_posix_glob" - oIFS=$IFS IFS=/ - $posix_glob set -f + set -f set fnord $dstdir shift - $posix_glob set +f + set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue + test X"$d" = X && continue - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -450,14 +449,25 @@ do else # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -472,20 +482,24 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - + set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else + # If $backupsuffix is set, and the file being installed + # already exists, attempt a backup. Don't worry if it fails, + # e.g., if mv doesn't support -f. + if test -n "$backupsuffix" && test -f "$dst"; then + $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null + fi + # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -493,24 +507,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 @@ -519,9 +533,9 @@ do done # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" +# time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: From 26eef015e2d2254375e13afaaf753b78932b1bf5 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 11 Apr 2022 16:07:09 +1000 Subject: [PATCH 058/287] Revert "update build-aux files to match autoconf-2.71" This reverts commit 0a8ca39fac6ad19096b6c263436f8b2dd51606f2. It turns out that the checked-in copies of these files are actually newer than autoconf-2.71's copies, so this was effectively a downgrade. Spotted by Bo Anderson via github --- config.guess | 1015 ++++++++++-------- config.sub | 2770 +++++++++++++++++++++++++------------------------- install-sh | 414 ++++---- 3 files changed, 2163 insertions(+), 2036 deletions(-) diff --git a/config.guess b/config.guess index a4077cce0..11fda528b 100755 --- a/config.guess +++ b/config.guess @@ -1,14 +1,12 @@ #! /bin/sh # Attempt to guess a canonical system name. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2012-09-25' +timestamp='2020-04-26' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but @@ -17,24 +15,22 @@ timestamp='2012-09-25' # General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - - -# Originally written by Per Bothner. Please send patches (context -# diff format) to and include a ChangeLog -# entry. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). # -# This script attempts to guess a canonical system name similar to -# config.sub. If it succeeds, it prints the system name on stdout, and -# exits with 0. Otherwise, it exits with 1. +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + me=`echo "$0" | sed -e 's,.*/,,'` @@ -43,7 +39,7 @@ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -54,9 +50,7 @@ version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -90,8 +84,6 @@ if test $# != 0; then exit 1 fi -trap 'exit 1' 1 2 15 - # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a @@ -102,34 +94,40 @@ trap 'exit 1' 1 2 15 # Portable tmp directory creation inspired by the Autoconf team. -set_cc_for_build=' -trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; -trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; -: ${TMPDIR=/tmp} ; - { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || - { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || - { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || - { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; -dummy=$tmp/dummy ; -tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; -case $CC_FOR_BUILD,$HOST_CC,$CC in - ,,) echo "int x;" > $dummy.c ; - for c in cc gcc c89 c99 ; do - if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then - CC_FOR_BUILD="$c"; break ; - fi ; - done ; - if test x"$CC_FOR_BUILD" = x ; then - CC_FOR_BUILD=no_compiler_found ; - fi - ;; - ,,*) CC_FOR_BUILD=$CC ;; - ,*,*) CC_FOR_BUILD=$HOST_CC ;; -esac ; set_cc_for_build= ;' +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) -if (test -f /.attbin/uname) >/dev/null 2>&1 ; then +if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi @@ -138,9 +136,37 @@ UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + # Note: order is significant - the case branches are not exclusive. -case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, @@ -153,21 +179,31 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" - UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ - /usr/sbin/$sysctl 2>/dev/null || echo unknown)` - case "${UNAME_MACHINE_ARCH}" in + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; - *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; esac # The Operating System including object format, if it has switched - # to ELF recently, or will in the future. - case "${UNAME_MACHINE_ARCH}" in + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) - eval $set_cc_for_build + set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then @@ -182,43 +218,72 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in os=netbsd ;; esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. - case "${UNAME_VERSION}" in + case "$UNAME_VERSION" in Debian*) release='-gnu' ;; *) - release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. - echo "${machine}-${os}${release}" + echo "$machine-${os}${release}${abi-}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" exit ;; *:ekkoBSD:*:*) - echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" exit ;; *:SolidBSD:*:*) - echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" exit ;; macppc:MirBSD:*:*) - echo powerpc-unknown-mirbsd${UNAME_RELEASE} + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" exit ;; *:MirBSD:*:*) - echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in @@ -236,63 +301,54 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV4.5 (21064)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") - UNAME_MACHINE="alpha" ;; + UNAME_MACHINE=alpha ;; "EV5 (21164)") - UNAME_MACHINE="alphaev5" ;; + UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") - UNAME_MACHINE="alphaev56" ;; + UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") - UNAME_MACHINE="alphapca56" ;; + UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") - UNAME_MACHINE="alphapca57" ;; + UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") - UNAME_MACHINE="alphaev6" ;; + UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") - UNAME_MACHINE="alphaev67" ;; + UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") - UNAME_MACHINE="alphaev68" ;; + UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") - UNAME_MACHINE="alphaev69" ;; + UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") - UNAME_MACHINE="alphaev7" ;; + UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") - UNAME_MACHINE="alphaev79" ;; + UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. - echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; - Alpha\ *:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # Should we change UNAME_MACHINE based on the output of uname instead - # of the specific Alpha model? - echo alpha-pc-interix - exit ;; - 21064:Windows_NT:50:3) - echo alpha-dec-winnt3.5 - exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-amigaos + echo "$UNAME_MACHINE"-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) - echo ${UNAME_MACHINE}-unknown-morphos + echo "$UNAME_MACHINE"-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition @@ -304,7 +360,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) - echo arm-acorn-riscix${UNAME_RELEASE} + echo arm-acorn-riscix"$UNAME_RELEASE" exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos @@ -331,38 +387,38 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) - echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; sun4H:SunOS:5.*:*) - echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) - echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) - echo i386-pc-auroraux${UNAME_RELEASE} + echo i386-pc-auroraux"$UNAME_RELEASE" exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) - eval $set_cc_for_build - SUN_ARCH="i386" + set_cc_for_build + SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then - SUN_ARCH="x86_64" + SUN_ARCH=x86_64 fi fi - echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. - echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in @@ -371,25 +427,25 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. - echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" exit ;; sun3*:SunOS:*:*) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` - test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) - echo m68k-sun-sunos${UNAME_RELEASE} + echo m68k-sun-sunos"$UNAME_RELEASE" ;; sun4) - echo sparc-sun-sunos${UNAME_RELEASE} + echo sparc-sun-sunos"$UNAME_RELEASE" ;; esac exit ;; aushp:SunOS:*:*) - echo sparc-auspex-sunos${UNAME_RELEASE} + echo sparc-auspex-sunos"$UNAME_RELEASE" exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not @@ -400,44 +456,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) - echo m68k-atari-mint${UNAME_RELEASE} + echo m68k-atari-mint"$UNAME_RELEASE" exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) - echo m68k-milan-mint${UNAME_RELEASE} + echo m68k-milan-mint"$UNAME_RELEASE" exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) - echo m68k-hades-mint${UNAME_RELEASE} + echo m68k-hades-mint"$UNAME_RELEASE" exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) - echo m68k-unknown-mint${UNAME_RELEASE} + echo m68k-unknown-mint"$UNAME_RELEASE" exit ;; m68k:machten:*:*) - echo m68k-apple-machten${UNAME_RELEASE} + echo m68k-apple-machten"$UNAME_RELEASE" exit ;; powerpc:machten:*:*) - echo powerpc-apple-machten${UNAME_RELEASE} + echo powerpc-apple-machten"$UNAME_RELEASE" exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) - echo mips-dec-ultrix${UNAME_RELEASE} + echo mips-dec-ultrix"$UNAME_RELEASE" exit ;; VAX*:ULTRIX*:*:*) - echo vax-dec-ultrix${UNAME_RELEASE} + echo vax-dec-ultrix"$UNAME_RELEASE" exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) - echo clipper-intergraph-clix${UNAME_RELEASE} + echo clipper-intergraph-clix"$UNAME_RELEASE" exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { @@ -446,23 +502,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) - printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) - printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) - printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && - dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && - SYSTEM_NAME=`$dummy $dummyarg` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } - echo mips-mips-riscos${UNAME_RELEASE} + echo mips-mips-riscos"$UNAME_RELEASE" exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax @@ -488,17 +544,17 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then - if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ - [ ${TARGET_BINARY_INTERFACE}x = x ] + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] then - echo m88k-dg-dgux${UNAME_RELEASE} + echo m88k-dg-dgux"$UNAME_RELEASE" else - echo m88k-dg-dguxbcs${UNAME_RELEASE} + echo m88k-dg-dguxbcs"$UNAME_RELEASE" fi else - echo i586-dg-dgux${UNAME_RELEASE} + echo i586-dg-dgux"$UNAME_RELEASE" fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) @@ -515,7 +571,7 @@ EOF echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) - echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id @@ -527,14 +583,14 @@ EOF if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include main() @@ -545,7 +601,7 @@ EOF exit(0); } EOF - if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then echo "$SYSTEM_NAME" else @@ -559,26 +615,27 @@ EOF exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` - if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi - if [ -x /usr/bin/oslevel ] ; then - IBM_REV=`/usr/bin/oslevel` + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else - IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" fi - echo ${IBM_ARCH}-ibm-aix${IBM_REV} + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; - ibmrt:4.4BSD:*|romp-ibm:BSD:*) + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and - echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx @@ -593,28 +650,28 @@ EOF echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - case "${UNAME_MACHINE}" in - 9000/31? ) HP_ARCH=m68000 ;; - 9000/[34]?? ) HP_ARCH=m68k ;; + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` - case "${sc_cpu_version}" in - 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 - 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 - case "${sc_kernel_bits}" in - 32) HP_ARCH="hppa2.0n" ;; - 64) HP_ARCH="hppa2.0w" ;; - '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi - if [ "${HP_ARCH}" = "" ]; then - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + if [ "$HP_ARCH" = "" ]; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include @@ -647,13 +704,13 @@ EOF exit (0); } EOF - (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if [ ${HP_ARCH} = "hppa2.0w" ] + if [ "$HP_ARCH" = hppa2.0w ] then - eval $set_cc_for_build + set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler @@ -664,23 +721,23 @@ EOF # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 - if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then - HP_ARCH="hppa2.0w" + HP_ARCH=hppa2.0w else - HP_ARCH="hppa64" + HP_ARCH=hppa64 fi fi - echo ${HP_ARCH}-hp-hpux${HPUX_REV} + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" exit ;; ia64:HP-UX:*:*) - HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` - echo ia64-hp-hpux${HPUX_REV} + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" exit ;; 3050*:HI-UX:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" #include int main () @@ -705,11 +762,11 @@ EOF exit (0); } EOF - $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; - 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) @@ -718,7 +775,7 @@ EOF *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; - hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) @@ -726,9 +783,9 @@ EOF exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then - echo ${UNAME_MACHINE}-unknown-osf1mk + echo "$UNAME_MACHINE"-unknown-osf1mk else - echo ${UNAME_MACHINE}-unknown-osf1 + echo "$UNAME_MACHINE"-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) @@ -753,130 +810,123 @@ EOF echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) - echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) - echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) - echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) - echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) - echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) - echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) - FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) - FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` - FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) - echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" exit ;; sparc*:BSD/OS:*:*) - echo sparc-unknown-bsdi${UNAME_RELEASE} + echo sparc-unknown-bsdi"$UNAME_RELEASE" exit ;; *:BSD/OS:*:*) - echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in + case "$UNAME_PROCESSOR" in amd64) - echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; - *) - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin + echo "$UNAME_MACHINE"-pc-cygwin exit ;; *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 + echo "$UNAME_MACHINE"-pc-mingw64 exit ;; *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 + echo "$UNAME_MACHINE"-pc-mingw32 exit ;; - i*:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - exit ;; - i*:windows32*:*) - # uname -m includes "-pc" on this system. - echo ${UNAME_MACHINE}-mingw32 + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys exit ;; i*:PW*:*) - echo ${UNAME_MACHINE}-pc-pw32 + echo "$UNAME_MACHINE"-pc-pw32 exit ;; *:Interix*:*) - case ${UNAME_MACHINE} in + case "$UNAME_MACHINE" in x86) - echo i586-pc-interix${UNAME_RELEASE} + echo i586-pc-interix"$UNAME_RELEASE" exit ;; authenticamd | genuineintel | EM64T) - echo x86_64-unknown-interix${UNAME_RELEASE} + echo x86_64-unknown-interix"$UNAME_RELEASE" exit ;; IA64) - echo ia64-unknown-interix${UNAME_RELEASE} + echo ia64-unknown-interix"$UNAME_RELEASE" exit ;; esac ;; - [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) - echo i${UNAME_MACHINE}-pc-mks - exit ;; - 8664:Windows_NT:*) - echo x86_64-pc-mks - exit ;; - i*:Windows_NT*:* | Pentium*:Windows_NT*:*) - # How do we know it's Interix rather than the generic POSIX subsystem? - # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we - # UNAME_MACHINE based on the output of uname instead of i386? - echo i586-pc-interix - exit ;; i*:UWIN*:*) - echo ${UNAME_MACHINE}-pc-uwin + echo "$UNAME_MACHINE"-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) - echo x86_64-unknown-cygwin - exit ;; - p*:CYGWIN*:*) - echo powerpcle-unknown-cygwin + echo x86_64-pc-cygwin exit ;; prep*:SunOS:5.*:*) - echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" exit ;; *:GNU:*:*) # the GNU system - echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland - echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix exit ;; aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; alpha:Linux:*:*) - case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; @@ -886,125 +936,169 @@ EOF EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 - if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi - echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; arm*:Linux:*:*) - eval $set_cc_for_build + set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then - echo ${UNAME_MACHINE}-unknown-linux-gnueabi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi else - echo ${UNAME_MACHINE}-unknown-linux-gnueabihf + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf fi fi exit ;; avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" exit ;; crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-gnu + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:Linux:*:*) - LIBC=gnu - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c - #ifdef __dietlibc__ - LIBC=dietlibc - #endif -EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` - echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; mips:Linux:*:* | mips64:Linux:*:*) - eval $set_cc_for_build - sed 's/^ //' << EOF >$dummy.c + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" #undef CPU - #undef ${UNAME_MACHINE} - #undef ${UNAME_MACHINE}el + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) - CPU=${UNAME_MACHINE}el + MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) - CPU=${UNAME_MACHINE} + MIPS_ENDIAN= #else - CPU= + MIPS_ENDIAN= #endif #endif EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` - test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; - or32:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; padre:Linux:*:*) - echo sparc-unknown-linux-gnu + echo sparc-unknown-linux-"$LIBC" exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-gnu + echo hppa64-unknown-linux-"$LIBC" exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in - PA7*) echo hppa1.1-unknown-linux-gnu ;; - PA8*) echo hppa2.0-unknown-linux-gnu ;; - *) echo hppa-unknown-linux-gnu ;; + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; esac exit ;; ppc64:Linux:*:*) - echo powerpc64-unknown-linux-gnu + echo powerpc64-unknown-linux-"$LIBC" exit ;; ppc:Linux:*:*) - echo powerpc-unknown-linux-gnu + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" exit ;; sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-gnu + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-gnu + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. @@ -1018,34 +1112,34 @@ EOF # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. - echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. - echo ${UNAME_MACHINE}-pc-os2-emx + echo "$UNAME_MACHINE"-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) - echo ${UNAME_MACHINE}-unknown-stop + echo "$UNAME_MACHINE"-unknown-stop exit ;; i*86:atheos:*:*) - echo ${UNAME_MACHINE}-unknown-atheos + echo "$UNAME_MACHINE"-unknown-atheos exit ;; i*86:syllable:*:*) - echo ${UNAME_MACHINE}-pc-syllable + echo "$UNAME_MACHINE"-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) - echo i386-unknown-lynxos${UNAME_RELEASE} + echo i386-unknown-lynxos"$UNAME_RELEASE" exit ;; i*86:*DOS:*:*) - echo ${UNAME_MACHINE}-pc-msdosdjgpp + echo "$UNAME_MACHINE"-pc-msdosdjgpp exit ;; - i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) - UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then - echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" fi exit ;; i*86:*:5:[678]*) @@ -1055,12 +1149,12 @@ EOF *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac - echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 @@ -1070,9 +1164,9 @@ EOF && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 - echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" else - echo ${UNAME_MACHINE}-pc-sysv32 + echo "$UNAME_MACHINE"-pc-sysv32 fi exit ;; pc:*:*:*) @@ -1080,7 +1174,7 @@ EOF # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub - # prints for the "djgpp" host, or else GDB configury will decide that + # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; @@ -1092,9 +1186,9 @@ EOF exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then - echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. - echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) @@ -1114,9 +1208,9 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; @@ -1125,28 +1219,28 @@ EOF test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ - && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ - && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) - echo m68k-unknown-lynxos${UNAME_RELEASE} + echo m68k-unknown-lynxos"$UNAME_RELEASE" exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) - echo sparc-unknown-lynxos${UNAME_RELEASE} + echo sparc-unknown-lynxos"$UNAME_RELEASE" exit ;; rs6000:LynxOS:2.*:*) - echo rs6000-unknown-lynxos${UNAME_RELEASE} + echo rs6000-unknown-lynxos"$UNAME_RELEASE" exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) - echo powerpc-unknown-lynxos${UNAME_RELEASE} + echo powerpc-unknown-lynxos"$UNAME_RELEASE" exit ;; SM[BE]S:UNIX_SV:*:*) - echo mips-dde-sysv${UNAME_RELEASE} + echo mips-dde-sysv"$UNAME_RELEASE" exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 @@ -1157,7 +1251,7 @@ EOF *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` - echo ${UNAME_MACHINE}-sni-sysv4 + echo "$UNAME_MACHINE"-sni-sysv4 else echo ns32k-sni-sysv fi @@ -1177,23 +1271,23 @@ EOF exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. - echo ${UNAME_MACHINE}-stratus-vos + echo "$UNAME_MACHINE"-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) - echo m68k-apple-aux${UNAME_RELEASE} + echo m68k-apple-aux"$UNAME_RELEASE" exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then - echo mips-nec-sysv${UNAME_RELEASE} + echo mips-nec-sysv"$UNAME_RELEASE" else - echo mips-unknown-sysv${UNAME_RELEASE} + echo mips-unknown-sysv"$UNAME_RELEASE" fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. @@ -1212,65 +1306,94 @@ EOF echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) - echo sx4-nec-superux${UNAME_RELEASE} + echo sx4-nec-superux"$UNAME_RELEASE" exit ;; SX-5:SUPER-UX:*:*) - echo sx5-nec-superux${UNAME_RELEASE} + echo sx5-nec-superux"$UNAME_RELEASE" exit ;; SX-6:SUPER-UX:*:*) - echo sx6-nec-superux${UNAME_RELEASE} + echo sx6-nec-superux"$UNAME_RELEASE" exit ;; SX-7:SUPER-UX:*:*) - echo sx7-nec-superux${UNAME_RELEASE} + echo sx7-nec-superux"$UNAME_RELEASE" exit ;; SX-8:SUPER-UX:*:*) - echo sx8-nec-superux${UNAME_RELEASE} + echo sx8-nec-superux"$UNAME_RELEASE" exit ;; SX-8R:SUPER-UX:*:*) - echo sx8r-nec-superux${UNAME_RELEASE} + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" exit ;; Power*:Rhapsody:*:*) - echo powerpc-apple-rhapsody${UNAME_RELEASE} + echo powerpc-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Rhapsody:*:*) - echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; *:Darwin:*:*) - UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in - i386) - eval $set_cc_for_build - if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then - if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ - (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_64BIT_ARCH >/dev/null - then - UNAME_PROCESSOR="x86_64" - fi - fi ;; unknown) UNAME_PROCESSOR=powerpc ;; esac - echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` - if test "$UNAME_PROCESSOR" = "x86"; then + if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi - echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; - NEO-?:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" exit ;; NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} + echo nse-tandem-nsk"$UNAME_RELEASE" exit ;; - NSR-?:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux @@ -1279,18 +1402,19 @@ EOF echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) - echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. - if test "$cputype" = "386"; then + # shellcheck disable=SC2154 + if test "$cputype" = 386; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi - echo ${UNAME_MACHINE}-unknown-plan9 + echo "$UNAME_MACHINE"-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 @@ -1311,14 +1435,14 @@ EOF echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) - echo mips-sei-seiux${UNAME_RELEASE} + echo mips-sei-seiux"$UNAME_RELEASE" exit ;; *:DragonFly:*:*) - echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` - case "${UNAME_MACHINE}" in + case "$UNAME_MACHINE" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; @@ -1327,24 +1451,39 @@ EOF echo i386-pc-xenix exit ;; i*86:skyos:*:*) - echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" exit ;; i*86:rdos:*:*) - echo ${UNAME_MACHINE}-pc-rdos + echo "$UNAME_MACHINE"-pc-rdos exit ;; i*86:AROS:*:*) - echo ${UNAME_MACHINE}-pc-aros + echo "$UNAME_MACHINE"-pc-aros exit ;; x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" exit ;; esac -eval $set_cc_for_build -cat >$dummy.c < "$dummy.c" < -# include +#include +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif #endif main () { @@ -1357,22 +1496,14 @@ main () #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 - "4" + "4" #else - "" + "" #endif - ); exit (0); + ); exit (0); #endif #endif -#if defined (__arm) && defined (__acorn) && defined (__unix) - printf ("arm-acorn-riscix\n"); exit (0); -#endif - -#if defined (hp300) && !defined (hpux) - printf ("m68k-hp-bsd\n"); exit (0); -#endif - #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" @@ -1412,39 +1543,54 @@ main () #endif #if defined (_SEQUENT_) - struct utsname un; - - uname(&un); - - if (strncmp(un.version, "V2", 2) == 0) { - printf ("i386-sequent-ptx2\n"); exit (0); - } - if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ - printf ("i386-sequent-ptx1\n"); exit (0); - } - printf ("i386-sequent-ptx\n"); exit (0); + struct utsname un; + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) -# if !defined (ultrix) -# include -# if defined (BSD) -# if BSD == 43 - printf ("vax-dec-bsd4.3\n"); exit (0); -# else -# if BSD == 199006 - printf ("vax-dec-bsd4.3reno\n"); exit (0); -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# endif -# else - printf ("vax-dec-bsd\n"); exit (0); -# endif -# else - printf ("vax-dec-ultrix\n"); exit (0); -# endif +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif #endif #if defined (alliant) && defined (i860) @@ -1455,54 +1601,44 @@ main () } EOF -$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } -test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } +echo "$0: unable to guess system type" >&2 -# Convex versions that predate uname can use getsysinfo(1) +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 < in order to provide the needed -information to handle your system. +year=`echo $timestamp | sed 's,-.*,,'` +# shellcheck disable=SC2003 +if test "`expr "\`date +%Y\`" - "$year"`" -lt 3 ; then + cat >&2 </dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` -UNAME_MACHINE = ${UNAME_MACHINE} -UNAME_RELEASE = ${UNAME_RELEASE} -UNAME_SYSTEM = ${UNAME_SYSTEM} -UNAME_VERSION = ${UNAME_VERSION} +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" EOF +fi exit 1 # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/config.sub b/config.sub index 89b128630..973a2980a 100755 --- a/config.sub +++ b/config.sub @@ -1,36 +1,31 @@ #! /bin/sh # Configuration validation subroutine script. -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, -# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, -# 2011, 2012 Free Software Foundation, Inc. +# Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2012-10-10' +timestamp='2020-05-04' -# This file is (in principle) common to ALL GNU software. -# The presence of a machine in this file suggests that SOME GNU software -# can handle that machine. It does not imply ALL GNU software can. -# -# This file is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. # # You should have received a copy of the GNU General Public License -# along with this program; if not, see . +# along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). -# Please send patches to . Submit a context -# diff and a properly formatted GNU ChangeLog entry. +# Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. @@ -38,7 +33,7 @@ timestamp='2012-10-10' # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: -# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases @@ -58,12 +53,11 @@ timestamp='2012-10-10' me=`echo "$0" | sed -e 's,.*/,,'` usage="\ -Usage: $0 [OPTION] CPU-MFR-OPSYS - $0 [OPTION] ALIAS +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. -Operation modes: +Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit @@ -73,9 +67,7 @@ Report bugs and patches to ." version="\ GNU config.sub ($timestamp) -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 -Free Software Foundation, Inc. +Copyright 1992-2020 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." @@ -97,12 +89,12 @@ while test $# -gt 0 ; do - ) # Use stdin as input. break ;; -* ) - echo "$me: invalid option $1$help" + echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. - echo $1 + echo "$1" exit ;; * ) @@ -118,1203 +110,1164 @@ case $# in exit 1;; esac -# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). -# Here we must recognize all the valid KERNEL-OS combinations. -maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` -case $maybe_os in - nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | \ - kopensolaris*-gnu* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - basic_machine=`echo $1 | sed 's/-[^-]*$//'` - if [ $basic_machine != $1 ] - then os=`echo $1 | sed 's/.*-/-/'` - else os=; fi - ;; -esac +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 ;; - -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ - -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ - -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ - -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ - -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ - -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ - -apple | -axis | -knuth | -cray | -microblaze*) - os= - basic_machine=$1 + *-*-*-*) + basic_machine=$field1-$field2 + os=$field3-$field4 ;; - -bluegene*) - os=-cnk + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc \ + | linux-newlib* | linux-musl* | linux-uclibc* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + os=linux-android + ;; + *) + basic_machine=$field1-$field2 + os=$field3 + ;; + esac ;; - -sim | -cisco | -oki | -wec | -winbond) - os= - basic_machine=$1 + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + os= + ;; + *) + basic_machine=$field1 + os=$field2 + ;; + esac + ;; + esac ;; - -scout) - ;; - -wrs) - os=-vxworks - basic_machine=$1 - ;; - -chorusos*) - os=-chorusos - basic_machine=$1 - ;; - -chorusrdb) - os=-chorusrdb - basic_machine=$1 - ;; - -hiux*) - os=-hiuxwe2 - ;; - -sco6) - os=-sco5v6 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5) - os=-sco3.2v5 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco4) - os=-sco3.2v4 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2.[4-9]*) - os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco3.2v[4-9]*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -sco*) - os=-sco3.2v2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -udk*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -isc) - os=-isc2.2 - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -clix*) - basic_machine=clipper-intergraph - ;; - -isc*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` - ;; - -lynx*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -lynx*) - os=-lynxos - ;; - -ptx*) - basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` - ;; - -windowsnt*) - os=`echo $os | sed -e 's/windowsnt/winnt/'` - ;; - -psos*) - os=-psos - ;; - -mint | -mint[0-9]*) - basic_machine=m68k-atari - os=-mint + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + os=bsd + ;; + a29khif) + basic_machine=a29k-amd + os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=scout + ;; + alliant) + basic_machine=fx80-alliant + os= + ;; + altos | altos3068) + basic_machine=m68k-altos + os= + ;; + am29k) + basic_machine=a29k-none + os=bsd + ;; + amdahl) + basic_machine=580-amdahl + os=sysv + ;; + amiga) + basic_machine=m68k-unknown + os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=bsd + ;; + aros) + basic_machine=i386-pc + os=aros + ;; + aux) + basic_machine=m68k-apple + os=aux + ;; + balance) + basic_machine=ns32k-sequent + os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=linux + ;; + cegcc) + basic_machine=arm-unknown + os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=bsd + ;; + convex-c2) + basic_machine=c2-convex + os=bsd + ;; + convex-c32) + basic_machine=c32-convex + os=bsd + ;; + convex-c34) + basic_machine=c34-convex + os=bsd + ;; + convex-c38) + basic_machine=c38-convex + os=bsd + ;; + cray) + basic_machine=j90-cray + os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + os= + ;; + da30) + basic_machine=m68k-da30 + os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + os= + ;; + delta88) + basic_machine=m88k-motorola + os=sysv3 + ;; + dicos) + basic_machine=i686-pc + os=dicos + ;; + djgpp) + basic_machine=i586-pc + os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=ose + ;; + gmicro) + basic_machine=tron-gmicro + os=sysv + ;; + go32) + basic_machine=i386-pc + os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=hms + ;; + harris) + basic_machine=m88k-harris + os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=proelf + ;; + i386mach) + basic_machine=i386-mach + os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + os=sysv + ;; + merlin) + basic_machine=ns32k-utek + os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + os=coff + ;; + morphos) + basic_machine=powerpc-unknown + os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=moxiebox + ;; + msdos) + basic_machine=i386-pc + os=msdos + ;; + msys) + basic_machine=i686-pc + os=msys + ;; + mvs) + basic_machine=i370-ibm + os=mvs + ;; + nacl) + basic_machine=le32-unknown + os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=newsos + ;; + news1000) + basic_machine=m68030-sony + os=newsos + ;; + necv70) + basic_machine=v70-nec + os=sysv + ;; + nh3000) + basic_machine=m68k-harris + os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=cxux + ;; + nindy960) + basic_machine=i960-intel + os=nindy + ;; + mon960) + basic_machine=i960-intel + os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=ose + ;; + os68k) + basic_machine=m68k-none + os=os68k + ;; + paragon) + basic_machine=i860-intel + os=osf + ;; + parisc) + basic_machine=hppa-unknown + os=linux + ;; + pw32) + basic_machine=i586-unknown + os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=rdos + ;; + rdos32) + basic_machine=i386-pc + os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=coff + ;; + sa29200) + basic_machine=a29k-amd + os=udi + ;; + sei) + basic_machine=mips-sei + os=seiux + ;; + sequent) + basic_machine=i386-sequent + os= + ;; + sps7) + basic_machine=m68k-bull + os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + os= + ;; + stratus) + basic_machine=i860-stratus + os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + os= + ;; + sun2os3) + basic_machine=m68000-sun + os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + os= + ;; + sun3os3) + basic_machine=m68k-sun + os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + os= + ;; + sun4os3) + basic_machine=sparc-sun + os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + os= + ;; + sv1) + basic_machine=sv1-cray + os=unicos + ;; + symmetry) + basic_machine=i386-sequent + os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=unicos + ;; + t90) + basic_machine=t90-cray + os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + os=tpf + ;; + udi29k) + basic_machine=a29k-amd + os=udi + ;; + ultra3) + basic_machine=a29k-nyu + os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=none + ;; + vaxv) + basic_machine=vax-dec + os=sysv + ;; + vms) + basic_machine=vax-dec + os=vms + ;; + vsta) + basic_machine=i386-pc + os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=vxworks + ;; + xbox) + basic_machine=i686-pc + os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + os=unicos + ;; + *) + basic_machine=$1 + os= + ;; + esac ;; esac -# Decode aliases for certain CPU-COMPANY combinations. +# Decode 1-component or ad-hoc basic machines case $basic_machine in - # Recognize the basic CPU types without company name. - # Some are omitted here because they have special meanings below. - 1750a | 580 \ - | a29k \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | be32 | be64 \ - | bfin \ - | c4x | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | epiphany \ - | fido | fr30 | frv \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia64 \ - | ip2k | iq2000 \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ - | mips | mipsbe | mipseb | mipsel | mipsle \ - | mips16 \ - | mips64 | mips64el \ - | mips64octeon | mips64octeonel \ - | mips64orion | mips64orionel \ - | mips64r5900 | mips64r5900el \ - | mips64vr | mips64vrel \ - | mips64vr4100 | mips64vr4100el \ - | mips64vr4300 | mips64vr4300el \ - | mips64vr5000 | mips64vr5000el \ - | mips64vr5900 | mips64vr5900el \ - | mipsisa32 | mipsisa32el \ - | mipsisa32r2 | mipsisa32r2el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 \ - | ns16k | ns32k \ - | open8 \ - | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pyramid \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond ;; - c54x) - basic_machine=tic54x-unknown + op50n) + cpu=hppa1.1 + vendor=oki ;; - c55x) - basic_machine=tic55x-unknown + op60c) + cpu=hppa1.1 + vendor=oki ;; - c6x) - basic_machine=tic6x-unknown + ibm*) + cpu=i370 + vendor=ibm ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip) - basic_machine=$basic_machine-unknown - os=-none + orion105) + cpu=clipper + vendor=highlevel ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple ;; - ms1) - basic_machine=mt-unknown + pmac | pmac-mpw) + cpu=powerpc + vendor=apple ;; - strongarm | thumb | xscale) - basic_machine=arm-unknown + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none + 3b*) + cpu=we32k + vendor=att ;; - xscaleeb) - basic_machine=armeb-unknown + bluegene*) + cpu=powerpc + vendor=ibm + os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + os=${os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + os=${os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $os in + irix*) + ;; + *) + os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + os=nextstep2 + ;; + *) + os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + os=${os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; - xscaleel) - basic_machine=armel-unknown + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 - exit 1 - ;; - # Recognize the basic CPU types with company name. - 580-* \ - | a29k-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia64-* \ - | ip2k-* | iq2000-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ - | mips16-* \ - | mips64-* | mips64el-* \ - | mips64octeon-* | mips64octeonel-* \ - | mips64orion-* | mips64orionel-* \ - | mips64r5900-* | mips64r5900el-* \ - | mips64vr-* | mips64vrel-* \ - | mips64vr4100-* | mips64vr4100el-* \ - | mips64vr4300-* | mips64vr4300el-* \ - | mips64vr5000-* | mips64vr5000el-* \ - | mips64vr5900-* | mips64vr5900el-* \ - | mipsisa32-* | mipsisa32el-* \ - | mipsisa32r2-* | mipsisa32r2el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pyramid-* \ - | rl78-* | romp-* | rs6000-* | rx-* \ - | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ - | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ - | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ - | sparclite-* \ - | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | xstormy16-* | xtensa*-* \ - | ymp-* \ - | z8k-* | z80-*) - ;; - # Recognize the basic CPU types without company name, with glob match. - xtensa*) - basic_machine=$basic_machine-unknown - ;; - # Recognize the various machine names and aliases which stand - # for a CPU type and a company and sometimes even an OS. - 386bsd) - basic_machine=i386-unknown - os=-bsd - ;; - 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) - basic_machine=m68000-att - ;; - 3b*) - basic_machine=we32k-att - ;; - a29khif) - basic_machine=a29k-amd - os=-udi - ;; - abacus) - basic_machine=abacus-unknown - ;; - adobe68k) - basic_machine=m68010-adobe - os=-scout - ;; - alliant | fx80) - basic_machine=fx80-alliant - ;; - altos | altos3068) - basic_machine=m68k-altos - ;; - am29k) - basic_machine=a29k-none - os=-bsd - ;; - amd64) - basic_machine=x86_64-pc - ;; - amd64-*) - basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - amdahl) - basic_machine=580-amdahl - os=-sysv - ;; - amiga | amiga-*) - basic_machine=m68k-unknown - ;; - amigaos | amigados) - basic_machine=m68k-unknown - os=-amigaos - ;; - amigaunix | amix) - basic_machine=m68k-unknown - os=-sysv4 - ;; - apollo68) - basic_machine=m68k-apollo - os=-sysv - ;; - apollo68bsd) - basic_machine=m68k-apollo - os=-bsd - ;; - aros) - basic_machine=i386-pc - os=-aros - ;; - aux) - basic_machine=m68k-apple - os=-aux - ;; - balance) - basic_machine=ns32k-sequent - os=-dynix - ;; - blackfin) - basic_machine=bfin-unknown - os=-linux - ;; - blackfin-*) - basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - bluegene*) - basic_machine=powerpc-ibm - os=-cnk - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c90) - basic_machine=c90-cray - os=-unicos - ;; - cegcc) - basic_machine=arm-unknown - os=-cegcc - ;; - convex-c1) - basic_machine=c1-convex - os=-bsd - ;; - convex-c2) - basic_machine=c2-convex - os=-bsd - ;; - convex-c32) - basic_machine=c32-convex - os=-bsd - ;; - convex-c34) - basic_machine=c34-convex - os=-bsd - ;; - convex-c38) - basic_machine=c38-convex - os=-bsd - ;; - cray | j90) - basic_machine=j90-cray - os=-unicos - ;; - craynv) - basic_machine=craynv-cray - os=-unicosmp - ;; - cr16 | cr16-*) - basic_machine=cr16-unknown - os=-elf - ;; - crds | unos) - basic_machine=m68k-crds - ;; - crisv32 | crisv32-* | etraxfs*) - basic_machine=crisv32-axis - ;; - cris | cris-* | etrax*) - basic_machine=cris-axis - ;; - crx) - basic_machine=crx-unknown - os=-elf - ;; - da30 | da30-*) - basic_machine=m68k-da30 - ;; - decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) - basic_machine=mips-dec - ;; - decsystem10* | dec10*) - basic_machine=pdp10-dec - os=-tops10 - ;; - decsystem20* | dec20*) - basic_machine=pdp10-dec - os=-tops20 - ;; - delta | 3300 | motorola-3300 | motorola-delta \ - | 3300-motorola | delta-motorola) - basic_machine=m68k-motorola - ;; - delta88) - basic_machine=m88k-motorola - os=-sysv3 - ;; - dicos) - basic_machine=i686-pc - os=-dicos - ;; - djgpp) - basic_machine=i586-pc - os=-msdosdjgpp - ;; - dpx20 | dpx20-*) - basic_machine=rs6000-bull - os=-bosx - ;; - dpx2* | dpx2*-bull) - basic_machine=m68k-bull - os=-sysv3 - ;; - ebmon29k) - basic_machine=a29k-amd - os=-ebmon - ;; - elxsi) - basic_machine=elxsi-elxsi - os=-bsd - ;; - encore | umax | mmax) - basic_machine=ns32k-encore - ;; - es1800 | OSE68k | ose68k | ose | OSE) - basic_machine=m68k-ericsson - os=-ose - ;; - fx2800) - basic_machine=i860-alliant - ;; - genix) - basic_machine=ns32k-ns - ;; - gmicro) - basic_machine=tron-gmicro - os=-sysv - ;; - go32) - basic_machine=i386-pc - os=-go32 - ;; - h3050r* | hiux*) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - h8300hms) - basic_machine=h8300-hitachi - os=-hms - ;; - h8300xray) - basic_machine=h8300-hitachi - os=-xray - ;; - h8500hms) - basic_machine=h8500-hitachi - os=-hms - ;; - harris) - basic_machine=m88k-harris - os=-sysv3 - ;; - hp300-*) - basic_machine=m68k-hp - ;; - hp300bsd) - basic_machine=m68k-hp - os=-bsd - ;; - hp300hpux) - basic_machine=m68k-hp - os=-hpux - ;; - hp3k9[0-9][0-9] | hp9[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k2[0-9][0-9] | hp9k31[0-9]) - basic_machine=m68000-hp - ;; - hp9k3[2-9][0-9]) - basic_machine=m68k-hp - ;; - hp9k6[0-9][0-9] | hp6[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hp9k7[0-79][0-9] | hp7[0-79][0-9]) - basic_machine=hppa1.1-hp - ;; - hp9k78[0-9] | hp78[0-9]) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) - # FIXME: really hppa2.0-hp - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][13679] | hp8[0-9][13679]) - basic_machine=hppa1.1-hp - ;; - hp9k8[0-9][0-9] | hp8[0-9][0-9]) - basic_machine=hppa1.0-hp - ;; - hppa-next) - os=-nextstep3 - ;; - hppaosf) - basic_machine=hppa1.1-hp - os=-osf - ;; - hppro) - basic_machine=hppa1.1-hp - os=-proelf - ;; - i370-ibm* | ibm*) - basic_machine=i370-ibm - ;; - i*86v32) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv32 - ;; - i*86v4*) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv4 - ;; - i*86v) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-sysv - ;; - i*86sol2) - basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` - os=-solaris2 - ;; - i386mach) - basic_machine=i386-mach - os=-mach - ;; - i386-vsta | vsta) - basic_machine=i386-unknown - os=-vsta - ;; - iris | iris4d) - basic_machine=mips-sgi - case $os in - -irix*) - ;; - *) - os=-irix4 - ;; - esac - ;; - isi68 | isi) - basic_machine=m68k-isi - os=-sysv - ;; - m68knommu) - basic_machine=m68k-unknown - os=-linux - ;; - m68knommu-*) - basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - m88k-omron*) - basic_machine=m88k-omron - ;; - magnum | m3230) - basic_machine=mips-mips - os=-sysv - ;; - merlin) - basic_machine=ns32k-utek - os=-sysv - ;; - microblaze*) - basic_machine=microblaze-xilinx - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i386-pc - os=-mingw32 - ;; - mingw32ce) - basic_machine=arm-unknown - os=-mingw32ce - ;; - miniframe) - basic_machine=m68000-convergent - ;; - *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) - basic_machine=m68k-atari - os=-mint - ;; - mips3*-*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` - ;; - mips3*) - basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown - ;; - monitor) - basic_machine=m68k-rom68k - os=-coff - ;; - morphos) - basic_machine=powerpc-unknown - os=-morphos - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i386-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - ncr3000) - basic_machine=i486-ncr - os=-sysv4 - ;; - netbsd386) - basic_machine=i386-unknown - os=-netbsd - ;; - netwinder) - basic_machine=armv4l-rebel - os=-linux - ;; - news | news700 | news800 | news900) - basic_machine=m68k-sony - os=-newsos - ;; - news1000) - basic_machine=m68030-sony - os=-newsos - ;; - news-3600 | risc-news) - basic_machine=mips-sony - os=-newsos - ;; - necv70) - basic_machine=v70-nec - os=-sysv - ;; - next | m*-next ) - basic_machine=m68k-next - case $os in - -nextstep* ) - ;; - -ns2*) - os=-nextstep2 - ;; - *) - os=-nextstep3 - ;; - esac - ;; - nh3000) - basic_machine=m68k-harris - os=-cxux - ;; - nh[45]000) - basic_machine=m88k-harris - os=-cxux - ;; - nindy960) - basic_machine=i960-intel - os=-nindy - ;; - mon960) - basic_machine=i960-intel - os=-mon960 - ;; - nonstopux) - basic_machine=mips-compaq - os=-nonstopux - ;; - np1) - basic_machine=np1-gould - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - op50n-* | op60c-*) - basic_machine=hppa1.1-oki - os=-proelf - ;; - openrisc | openrisc-*) - basic_machine=or32-unknown - ;; - os400) - basic_machine=powerpc-ibm - os=-os400 - ;; - OSE68000 | ose68000) - basic_machine=m68000-ericsson - os=-ose - ;; - os68k) - basic_machine=m68k-none - os=-os68k - ;; - pa-hitachi) - basic_machine=hppa1.1-hitachi - os=-hiuxwe2 - ;; - paragon) - basic_machine=i860-intel - os=-osf - ;; - parisc) - basic_machine=hppa-unknown - os=-linux - ;; - parisc-*) - basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` - os=-linux - ;; - pbd) - basic_machine=sparc-tti - ;; - pbb) - basic_machine=m68k-tti - ;; - pc532 | pc532-*) - basic_machine=ns32k-pc532 + cpu=$basic_machine + vendor=pc ;; + # These rules are duplicated from below for sake of the special case above; + # i.e. things that normalized to x86 arches should also default to "pc" pc98) - basic_machine=i386-pc + cpu=i386 + vendor=pc ;; - pc98-*) - basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + x64 | amd64) + cpu=x86_64 + vendor=pc ;; - pentium | p5 | k5 | k6 | nexgen | viac3) - basic_machine=i586-pc + # Recognize the basic CPU types without company name. + *) + cpu=$basic_machine + vendor=unknown ;; - pentiumpro | p6 | 6x86 | athlon | athlon_*) - basic_machine=i686-pc +esac + +unset -v basic_machine + +# Decode basic machines in the full and proper CPU-Company form. +case $cpu-$vendor in + # Here we handle the default manufacturer of certain CPU types in canonical form. It is in + # some cases the only manufacturer, in others, it is the most popular. + craynv-unknown) + vendor=cray + os=${os:-unicosmp} ;; - pentiumii | pentium2 | pentiumiii | pentium3) - basic_machine=i686-pc + c90-unknown | c90-cray) + vendor=cray + os=${os:-unicos} ;; - pentium4) - basic_machine=i786-pc + fx80-unknown) + vendor=alliant ;; - pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) - basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + romp-unknown) + vendor=ibm ;; - pentiumpro-* | p6-* | 6x86-* | athlon-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + mmix-unknown) + vendor=knuth ;; - pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) - basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + microblaze-unknown | microblazeel-unknown) + vendor=xilinx ;; - pentium4-*) - basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + rs6000-unknown) + vendor=ibm ;; - pn) - basic_machine=pn-gould + vax-unknown) + vendor=dec ;; - power) basic_machine=power-ibm + pdp11-unknown) + vendor=dec ;; - ppc | ppcbe) basic_machine=powerpc-unknown + we32k-unknown) + vendor=att ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + cydra-unknown) + vendor=cydrome ;; - ppcle | powerpclittle | ppc-le | powerpc-little) - basic_machine=powerpcle-unknown + i370-ibm*) + vendor=ibm ;; - ppcle-* | powerpclittle-*) - basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + orion-unknown) + vendor=highlevel ;; - ppc64) basic_machine=powerpc64-unknown - ;; - ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppc64le | powerpc64little | ppc64-le | powerpc64-little) - basic_machine=powerpc64le-unknown - ;; - ppc64le-* | powerpc64little-*) - basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ps2) - basic_machine=i386-ibm - ;; - pw32) - basic_machine=i586-unknown - os=-pw32 - ;; - rdos) - basic_machine=i386-pc - os=-rdos - ;; - rom68k) - basic_machine=m68k-rom68k - os=-coff - ;; - rm[46]00) - basic_machine=mips-siemens - ;; - rtpc | rtpc-*) - basic_machine=romp-ibm - ;; - s390 | s390-*) - basic_machine=s390-ibm - ;; - s390x | s390x-*) - basic_machine=s390x-ibm - ;; - sa29200) - basic_machine=a29k-amd - os=-udi - ;; - sb1) - basic_machine=mipsisa64sb1-unknown - ;; - sb1el) - basic_machine=mipsisa64sb1el-unknown - ;; - sde) - basic_machine=mipsisa32-sde - os=-elf - ;; - sei) - basic_machine=mips-sei - os=-seiux - ;; - sequent) - basic_machine=i386-sequent - ;; - sh) - basic_machine=sh-hitachi - os=-hms - ;; - sh5el) - basic_machine=sh5le-unknown - ;; - sh64) - basic_machine=sh64-unknown - ;; - sparclite-wrs | simso-wrs) - basic_machine=sparclite-wrs - os=-vxworks - ;; - sps7) - basic_machine=m68k-bull - os=-sysv2 - ;; - spur) - basic_machine=spur-unknown - ;; - st2000) - basic_machine=m68k-tandem - ;; - stratus) - basic_machine=i860-stratus - os=-sysv4 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - sun2) - basic_machine=m68000-sun - ;; - sun2os3) - basic_machine=m68000-sun - os=-sunos3 - ;; - sun2os4) - basic_machine=m68000-sun - os=-sunos4 - ;; - sun3os3) - basic_machine=m68k-sun - os=-sunos3 - ;; - sun3os4) - basic_machine=m68k-sun - os=-sunos4 - ;; - sun4os3) - basic_machine=sparc-sun - os=-sunos3 - ;; - sun4os4) - basic_machine=sparc-sun - os=-sunos4 - ;; - sun4sol2) - basic_machine=sparc-sun - os=-solaris2 - ;; - sun3 | sun3-*) - basic_machine=m68k-sun - ;; - sun4) - basic_machine=sparc-sun - ;; - sun386 | sun386i | roadrunner) - basic_machine=i386-sun - ;; - sv1) - basic_machine=sv1-cray - os=-unicos - ;; - symmetry) - basic_machine=i386-sequent - os=-dynix - ;; - t3e) - basic_machine=alphaev5-cray - os=-unicos - ;; - t90) - basic_machine=t90-cray - os=-unicos - ;; - tile*) - basic_machine=$basic_machine-unknown - os=-linux-gnu - ;; - tx39) - basic_machine=mipstx39-unknown - ;; - tx39el) - basic_machine=mipstx39el-unknown - ;; - toad1) - basic_machine=pdp10-xkl - os=-tops20 - ;; - tower | tower-32) - basic_machine=m68k-ncr - ;; - tpf) - basic_machine=s390x-ibm - os=-tpf - ;; - udi29k) - basic_machine=a29k-amd - os=-udi - ;; - ultra3) - basic_machine=a29k-nyu - os=-sym1 - ;; - v810 | necv810) - basic_machine=v810-nec - os=-none - ;; - vaxv) - basic_machine=vax-dec - os=-sysv - ;; - vms) - basic_machine=vax-dec - os=-vms - ;; - vpp*|vx|vx-*) - basic_machine=f301-fujitsu - ;; - vxworks960) - basic_machine=i960-wrs - os=-vxworks - ;; - vxworks68) - basic_machine=m68k-wrs - os=-vxworks - ;; - vxworks29k) - basic_machine=a29k-wrs - os=-vxworks - ;; - w65*) - basic_machine=w65-wdc - os=-none - ;; - w89k-*) - basic_machine=hppa1.1-winbond - os=-proelf - ;; - xbox) - basic_machine=i686-pc - os=-mingw32 - ;; - xps | xps100) - basic_machine=xps100-honeywell - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - ymp) - basic_machine=ymp-cray - os=-unicos - ;; - z8k-*-coff) - basic_machine=z8k-unknown - os=-sim - ;; - z80-*-coff) - basic_machine=z80-unknown - os=-sim - ;; - none) - basic_machine=none-none - os=-none + xps-unknown | xps100-unknown) + cpu=xps100 + vendor=honeywell ;; -# Here we handle the default manufacturer of certain CPU types. It is in -# some cases the only manufacturer, in others, it is the most popular. - w89k) - basic_machine=hppa1.1-winbond + # Here we normalize CPU types with a missing or matching vendor + dpx20-unknown | dpx20-bull) + cpu=rs6000 + vendor=bull + os=${os:-bosx} ;; - op50n) - basic_machine=hppa1.1-oki + + # Here we normalize CPU types irrespective of the vendor + amd64-*) + cpu=x86_64 ;; - op60c) - basic_machine=hppa1.1-oki + blackfin-*) + cpu=bfin + os=linux ;; - romp) - basic_machine=romp-ibm + c54x-*) + cpu=tic54x ;; - mmix) - basic_machine=mmix-knuth + c55x-*) + cpu=tic55x ;; - rs6000) - basic_machine=rs6000-ibm + c6x-*) + cpu=tic6x ;; - vax) - basic_machine=vax-dec + e500v[12]-*) + cpu=powerpc + os=$os"spe" ;; - pdp10) - # there are many clones, so DEC is not a safe bet - basic_machine=pdp10-unknown + mips3*-*) + cpu=mips64 ;; - pdp11) - basic_machine=pdp11-dec + ms1-*) + cpu=mt ;; - we32k) - basic_machine=we32k-att + m68knommu-*) + cpu=m68k + os=linux ;; - sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) - basic_machine=sh-unknown + m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*) + cpu=s12z ;; - sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) - basic_machine=sparc-sun + openrisc-*) + cpu=or32 ;; - cydra) - basic_machine=cydra-cydrome + parisc-*) + cpu=hppa + os=linux ;; - orion) - basic_machine=orion-highlevel + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + cpu=i586 ;; - orion105) - basic_machine=clipper-highlevel + pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*) + cpu=i686 ;; - mac | mpw | mac-mpw) - basic_machine=m68k-apple + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + cpu=i686 ;; - pmac | pmac-mpw) - basic_machine=powerpc-apple + pentium4-*) + cpu=i786 ;; - *-unknown) - # Make sure to match an already-canonicalized machine name. + pc98-*) + cpu=i386 ;; + ppc-* | ppcbe-*) + cpu=powerpc + ;; + ppcle-* | powerpclittle-*) + cpu=powerpcle + ;; + ppc64-*) + cpu=powerpc64 + ;; + ppc64le-* | powerpc64little-*) + cpu=powerpc64le + ;; + sb1-*) + cpu=mipsisa64sb1 + ;; + sb1el-*) + cpu=mipsisa64sb1el + ;; + sh5e[lb]-*) + cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'` + ;; + spur-*) + cpu=spur + ;; + strongarm-* | thumb-*) + cpu=arm + ;; + tx39-*) + cpu=mipstx39 + ;; + tx39el-*) + cpu=mipstx39el + ;; + x64-*) + cpu=x86_64 + ;; + xscale-* | xscalee[bl]-*) + cpu=`echo "$cpu" | sed 's/^xscale/arm/'` + ;; + + # Recognize the canonical CPU Types that limit and/or modify the + # company names they are paired with. + cr16-*) + os=${os:-elf} + ;; + crisv32-* | etraxfs*-*) + cpu=crisv32 + vendor=axis + ;; + cris-* | etrax*-*) + cpu=cris + vendor=axis + ;; + crx-*) + os=${os:-elf} + ;; + neo-tandem) + cpu=neo + vendor=tandem + ;; + nse-tandem) + cpu=nse + vendor=tandem + ;; + nsr-tandem) + cpu=nsr + vendor=tandem + ;; + nsv-tandem) + cpu=nsv + vendor=tandem + ;; + nsx-tandem) + cpu=nsx + vendor=tandem + ;; + s390-*) + cpu=s390 + vendor=ibm + ;; + s390x-*) + cpu=s390x + vendor=ibm + ;; + tile*-*) + os=${os:-linux-gnu} + ;; + *) - echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 - exit 1 + # Recognize the canonical CPU types that are allowed with any + # company name. + case $cpu in + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | abacus \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \ + | alphapca5[67] | alpha64pca5[67] \ + | am33_2.0 \ + | amdgcn \ + | arc | arceb \ + | arm | arm[lb]e | arme[lb] | armv* \ + | avr | avr32 \ + | asmjs \ + | ba \ + | be32 | be64 \ + | bfin | bpf | bs2000 \ + | c[123]* | c30 | [cjt]90 | c4x \ + | c8051 | clipper | craynv | csky | cydra \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | elxsi | epiphany \ + | f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \ + | h8300 | h8500 \ + | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i*86 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle \ + | m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \ + | m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \ + | m88110 | m88k | maxq | mb | mcore | mep | metag \ + | microblaze | microblazeel \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64eb | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mmix \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nfp \ + | nios | nios2 | nios2eb | nios2el \ + | none | np1 | ns16k | ns32k | nvptx \ + | open8 \ + | or1k* \ + | or32 \ + | orion \ + | picochip \ + | pdp10 | pdp11 | pj | pjl | pn | power \ + | powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \ + | pru \ + | pyramid \ + | riscv | riscv32 | riscv64 \ + | rl78 | romp | rs6000 | rx \ + | score \ + | sh | shl \ + | sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \ + | sh[1234]e[lb] | sh[12345][lb]e | sh[23]ele | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \ + | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \ + | spu \ + | tahoe \ + | tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \ + | tron \ + | ubicom32 \ + | v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \ + | vax \ + | visium \ + | w65 \ + | wasm32 | wasm64 \ + | we32k \ + | x86 | x86_64 | xc16x | xgate | xps100 \ + | xstormy16 | xtensa* \ + | ymp \ + | z8k | z80) + ;; + + *) + echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2 + exit 1 + ;; + esac ;; esac # Here we canonicalize certain aliases for manufacturers. -case $basic_machine in - *-digital*) - basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` +case $vendor in + digital*) + vendor=dec ;; - *-commodore*) - basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + commodore*) + vendor=cbm ;; *) ;; @@ -1322,200 +1275,244 @@ esac # Decode manufacturer-specific aliases for certain operating systems. -if [ x"$os" != x"" ] +if [ x$os != x ] then case $os in - # First match some system type aliases - # that might get confused with valid system types. - # -solaris* is a basic system type, with this one exception. - -auroraux) - os=-auroraux + # First match some system type aliases that might get confused + # with valid system types. + # solaris* is a basic system type, with this one exception. + auroraux) + os=auroraux ;; - -solaris1 | -solaris1.*) + bluegene*) + os=cnk + ;; + solaris1 | solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; - -solaris) - os=-solaris2 + solaris) + os=solaris2 ;; - -svr4*) - os=-sysv4 + unixware*) + os=sysv4.2uw ;; - -unixware*) - os=-sysv4.2uw - ;; - -gnu/linux*) + gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; - # First accept the basic system types. + # es1800 is here to avoid being matched by es* (a different OS) + es1800*) + os=ose + ;; + # Some version numbers need modification + chorusos*) + os=chorusos + ;; + isc) + os=isc2.2 + ;; + sco6) + os=sco5v6 + ;; + sco5) + os=sco3.2v5 + ;; + sco4) + os=sco3.2v4 + ;; + sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + ;; + sco3.2v[4-9]* | sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + ;; + scout) + # Don't match below + ;; + sco*) + os=sco3.2v2 + ;; + psos*) + os=psos + ;; + # Now accept the basic system types. # The portable systems comes first. - # Each alternative MUST END IN A *, to match a version number. - # -sysv* is not here because it comes later, after sysvr4. - -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ - | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ - | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ - | -sym* | -kopensolaris* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* \ - | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ - | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ - | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ - | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ - | -chorusos* | -chorusrdb* | -cegcc* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* \ - | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ - | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ - | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ - | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ - | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ - | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ - | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Each alternative MUST end in a * to match a version number. + # sysv* is not here because it comes later, after sysvr4. + gnu* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ + | *vms* | esix* | aix* | cnk* | sunos | sunos[34]*\ + | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ + | sym* | kopensolaris* | plan9* \ + | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ + | aos* | aros* | cloudabi* | sortix* | twizzler* \ + | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ + | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ + | knetbsd* | mirbsd* | netbsd* \ + | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ + | ekkobsd* | kfreebsd* | freebsd* | riscix* | lynxos* \ + | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ + | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ + | udi* | eabi* | lites* | ieee* | go32* | aux* | hcos* \ + | chorusrdb* | cegcc* | glidix* \ + | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ + | midipix* | mingw32* | mingw64* | linux-gnu* | linux-android* \ + | linux-newlib* | linux-musl* | linux-uclibc* \ + | uxpv* | beos* | mpeix* | udk* | moxiebox* \ + | interix* | uwin* | mks* | rhapsody* | darwin* \ + | openstep* | oskit* | conix* | pw32* | nonstopux* \ + | storm-chaos* | tops10* | tenex* | tops20* | its* \ + | os2* | vos* | palmos* | uclinux* | nucleus* \ + | morphos* | superux* | rtmk* | windiss* \ + | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ + | skyos* | haiku* | rdos* | toppers* | drops* | es* \ + | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ + | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ + | nsk* | powerunix* | genode*) # Remember, each alternative MUST END IN *, to match a version number. ;; - -qnx*) - case $basic_machine in - x86-* | i*86-*) + qnx*) + case $cpu in + x86 | i*86) ;; *) - os=-nto$os + os=nto-$os ;; esac ;; - -nto-qnx*) + hiux*) + os=hiuxwe2 ;; - -nto*) + nto-qnx*) + ;; + nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; - -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ - | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ - | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + sim | xray | os68k* | v88r* \ + | windows* | osx | abug | netware* | os9* \ + | macos* | mpw* | magic* | mmixware* | mon960* | lnews*) ;; - -mac*) - os=`echo $os | sed -e 's|mac|macos|'` + linux-dietlibc) + os=linux-dietlibc ;; - -linux-dietlibc) - os=-linux-dietlibc - ;; - -linux*) + linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; - -sunos5*) - os=`echo $os | sed -e 's|sunos5|solaris2|'` + lynx*178) + os=lynxos178 ;; - -sunos6*) - os=`echo $os | sed -e 's|sunos6|solaris3|'` + lynx*5) + os=lynxos5 ;; - -opened*) - os=-openedition + lynx*) + os=lynxos ;; - -os400*) - os=-os400 + mac*) + os=`echo "$os" | sed -e 's|mac|macos|'` ;; - -wince*) - os=-wince + opened*) + os=openedition ;; - -osfrose*) - os=-osfrose + os400*) + os=os400 ;; - -osf*) - os=-osf + sunos5*) + os=`echo "$os" | sed -e 's|sunos5|solaris2|'` ;; - -utek*) - os=-bsd + sunos6*) + os=`echo "$os" | sed -e 's|sunos6|solaris3|'` ;; - -dynix*) - os=-bsd + wince*) + os=wince ;; - -acis*) - os=-aos + utek*) + os=bsd ;; - -atheos*) - os=-atheos + dynix*) + os=bsd ;; - -syllable*) - os=-syllable + acis*) + os=aos ;; - -386bsd) - os=-bsd + atheos*) + os=atheos ;; - -ctix* | -uts*) - os=-sysv + syllable*) + os=syllable ;; - -nova*) - os=-rtmk-nova + 386bsd) + os=bsd ;; - -ns2 ) - os=-nextstep2 + ctix* | uts*) + os=sysv ;; - -nsk*) - os=-nsk + nova*) + os=rtmk-nova + ;; + ns2) + os=nextstep2 ;; # Preserve the version number of sinix5. - -sinix5.*) + sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; - -sinix*) - os=-sysv4 + sinix*) + os=sysv4 ;; - -tpf*) - os=-tpf + tpf*) + os=tpf ;; - -triton*) - os=-sysv3 + triton*) + os=sysv3 ;; - -oss*) - os=-sysv3 + oss*) + os=sysv3 ;; - -svr4) - os=-sysv4 + svr4*) + os=sysv4 ;; - -svr3) - os=-sysv3 + svr3) + os=sysv3 ;; - -sysvr4) - os=-sysv4 + sysvr4) + os=sysv4 ;; - # This must come after -sysvr4. - -sysv*) + # This must come after sysvr4. + sysv*) ;; - -ose*) - os=-ose + ose*) + os=ose ;; - -es1800*) - os=-ose + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) + os=mint ;; - -xenix) - os=-xenix + zvmoe) + os=zvmoe ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) - os=-mint + dicos*) + os=dicos ;; - -aros*) - os=-aros + pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $cpu in + arm*) + os=eabi + ;; + *) + os=elf + ;; + esac ;; - -kaos*) - os=-kaos + nacl*) ;; - -zvmoe) - os=-zvmoe + ios) ;; - -dicos*) - os=-dicos + none) ;; - -nacl*) - ;; - -none) + *-eabi) ;; *) - # Get rid of the `-' at the beginning of $os. - os=`echo $os | sed 's/[^-]*-//'` - echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + echo Invalid configuration \`"$1"\': system \`"$os"\' not recognized 1>&2 exit 1 ;; esac @@ -1531,258 +1528,265 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -case $basic_machine in +case $cpu-$vendor in score-*) - os=-elf + os=elf ;; spu-*) - os=-elf + os=elf ;; *-acorn) - os=-riscix1.2 + os=riscix1.2 ;; arm*-rebel) - os=-linux + os=linux ;; arm*-semi) - os=-aout + os=aout ;; c4x-* | tic4x-*) - os=-coff + os=coff + ;; + c8051-*) + os=elf + ;; + clipper-intergraph) + os=clix ;; hexagon-*) - os=-elf + os=elf ;; tic54x-*) - os=-coff + os=coff ;; tic55x-*) - os=-coff + os=coff ;; tic6x-*) - os=-coff + os=coff ;; # This must come before the *-dec entry. pdp10-*) - os=-tops20 + os=tops20 ;; pdp11-*) - os=-none + os=none ;; *-dec | vax-*) - os=-ultrix4.2 + os=ultrix4.2 ;; m68*-apollo) - os=-domain + os=domain ;; i386-sun) - os=-sunos4.0.2 + os=sunos4.0.2 ;; m68000-sun) - os=-sunos3 + os=sunos3 ;; m68*-cisco) - os=-aout + os=aout ;; mep-*) - os=-elf + os=elf ;; mips*-cisco) - os=-elf + os=elf ;; mips*-*) - os=-elf + os=elf ;; or32-*) - os=-coff + os=coff ;; *-tti) # must be before sparc entry or we get the wrong os. - os=-sysv3 + os=sysv3 ;; sparc-* | *-sun) - os=-sunos4.1.1 + os=sunos4.1.1 + ;; + pru-*) + os=elf ;; *-be) - os=-beos - ;; - *-haiku) - os=-haiku + os=beos ;; *-ibm) - os=-aix + os=aix ;; *-knuth) - os=-mmixware + os=mmixware ;; *-wec) - os=-proelf + os=proelf ;; *-winbond) - os=-proelf + os=proelf ;; *-oki) - os=-proelf + os=proelf ;; *-hp) - os=-hpux + os=hpux ;; *-hitachi) - os=-hiux + os=hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) - os=-sysv + os=sysv ;; *-cbm) - os=-amigaos + os=amigaos ;; *-dg) - os=-dgux + os=dgux ;; *-dolphin) - os=-sysv3 + os=sysv3 ;; m68k-ccur) - os=-rtu + os=rtu ;; m88k-omron*) - os=-luna - ;; - *-next ) - os=-nextstep - ;; - *-sequent) - os=-ptx - ;; - *-crds) - os=-unos - ;; - *-ns) - os=-genix - ;; - i370-*) - os=-mvs + os=luna ;; *-next) - os=-nextstep3 + os=nextstep + ;; + *-sequent) + os=ptx + ;; + *-crds) + os=unos + ;; + *-ns) + os=genix + ;; + i370-*) + os=mvs ;; *-gould) - os=-sysv + os=sysv ;; *-highlevel) - os=-bsd + os=bsd ;; *-encore) - os=-bsd + os=bsd ;; *-sgi) - os=-irix + os=irix ;; *-siemens) - os=-sysv4 + os=sysv4 ;; *-masscomp) - os=-rtu + os=rtu ;; f30[01]-fujitsu | f700-fujitsu) - os=-uxpv + os=uxpv ;; *-rom68k) - os=-coff + os=coff ;; *-*bug) - os=-coff + os=coff ;; *-apple) - os=-macos + os=macos ;; *-atari*) - os=-mint + os=mint + ;; + *-wrs) + os=vxworks ;; *) - os=-none + os=none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. -vendor=unknown -case $basic_machine in - *-unknown) +case $vendor in + unknown) case $os in - -riscix*) + riscix*) vendor=acorn ;; - -sunos*) + sunos*) vendor=sun ;; - -cnk*|-aix*) + cnk*|-aix*) vendor=ibm ;; - -beos*) + beos*) vendor=be ;; - -hpux*) + hpux*) vendor=hp ;; - -mpeix*) + mpeix*) vendor=hp ;; - -hiux*) + hiux*) vendor=hitachi ;; - -unos*) + unos*) vendor=crds ;; - -dgux*) + dgux*) vendor=dg ;; - -luna*) + luna*) vendor=omron ;; - -genix*) + genix*) vendor=ns ;; - -mvs* | -opened*) + clix*) + vendor=intergraph + ;; + mvs* | opened*) vendor=ibm ;; - -os400*) + os400*) vendor=ibm ;; - -ptx*) + ptx*) vendor=sequent ;; - -tpf*) + tpf*) vendor=ibm ;; - -vxsim* | -vxworks* | -windiss*) + vxsim* | vxworks* | windiss*) vendor=wrs ;; - -aux*) + aux*) vendor=apple ;; - -hms*) + hms*) vendor=hitachi ;; - -mpw* | -macos*) + mpw* | macos*) vendor=apple ;; - -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) vendor=atari ;; - -vos*) + vos*) vendor=stratus ;; esac - basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac -echo $basic_machine$os +echo "$cpu-$vendor-$os" exit # Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) +# eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" diff --git a/install-sh b/install-sh index ec298b537..377bb8687 100755 --- a/install-sh +++ b/install-sh @@ -1,7 +1,7 @@ #!/bin/sh # install - install a program, script, or datafile -scriptversion=2020-11-14.01; # UTC +scriptversion=2011-11-20.07; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the @@ -41,15 +41,19 @@ scriptversion=2020-11-14.01; # UTC # This script is compatible with the BSD install script, but was written # from scratch. -tab=' ' nl=' ' -IFS=" $tab$nl" +IFS=" "" $nl" -# Set DOITPROG to "echo" to test this script. +# set DOITPROG to echo to test this script +# Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} -doit_exec=${doit:-exec} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi # Put in absolute file names if you don't have them in your path; # or use environment vars. @@ -64,16 +68,22 @@ mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + posix_mkdir= # Desired mode of installed file. mode=0755 -# Create dirs (including intermediate dirs) using mode 755. -# This is like GNU 'install' as of coreutils 8.32 (2020). -mkdir_umask=22 - -backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= @@ -87,7 +97,7 @@ dir_arg= dst_arg= copy_on_change=false -is_target_a_directory=possibly +no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE @@ -104,28 +114,18 @@ Options: --version display version info and exit. -c (ignored) - -C install only if different (preserve data modification time) + -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. - -p pass -p to $cpprog. -s $stripprog installed files. - -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG - -By default, rm is invoked with -f; when overridden with RMPROG, -it's up to you to specify -f if you want it. - -If -S is not specified, no backups are attempted. - -Email bug reports to bug-automake@gnu.org. -Automake home page: https://www.gnu.org/software/automake/ " while test $# -ne 0; do @@ -137,62 +137,46 @@ while test $# -ne 0; do -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" - shift;; + shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 - case $mode in - *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; -o) chowncmd="$chownprog $2" - shift;; - - -p) cpprog="$cpprog -p";; + shift;; -s) stripcmd=$stripprog;; - -S) backupsuffix="$2" - shift;; + -t) dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; - -t) - is_target_a_directory=always - dst_arg=$2 - # Protect names problematic for 'test' and other utilities. - case $dst_arg in - -* | [=\(\)!]) dst_arg=./$dst_arg;; - esac - shift;; - - -T) is_target_a_directory=never;; + -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; - --) shift - break;; + --) shift + break;; - -*) echo "$0: invalid option: $1" >&2 - exit 1;; + -*) echo "$0: invalid option: $1" >&2 + exit 1;; *) break;; esac shift done -# We allow the use of options -d and -T together, by making -d -# take the precedence; this is for compatibility with GNU install. - -if test -n "$dir_arg"; then - if test -n "$dst_arg"; then - echo "$0: target directory not allowed when installing a directory." >&2 - exit 1 - fi -fi - if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. @@ -223,15 +207,6 @@ if test $# -eq 0; then exit 0 fi -if test -z "$dir_arg"; then - if test $# -gt 1 || test "$is_target_a_directory" = always; then - if test ! -d "$dst_arg"; then - echo "$0: $dst_arg: Is not a directory." >&2 - exit 1 - fi - fi -fi - if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 @@ -248,16 +223,16 @@ if test -z "$dir_arg"; then *[0-7]) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw='% 200' + u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then - u_plus_rw= + u_plus_rw= else - u_plus_rw=,u+rw + u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac @@ -275,10 +250,6 @@ do dstdir=$dst test -d "$dstdir" dstdir_status=$? - # Don't chown directories that already exist. - if test $dstdir_status = 0; then - chowncmd="" - fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command @@ -295,148 +266,178 @@ do fi dst=$dst_arg - # If destination is a directory, append the input filename. + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. if test -d "$dst"; then - if test "$is_target_a_directory" = never; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 fi dstdir=$dst - dstbase=`basename "$src"` - case $dst in - */) dst=$dst$dstbase;; - *) dst=$dst/$dstbase;; - esac + dst=$dstdir/`basename "$src"` dstdir_status=0 else - dstdir=`dirname "$dst"` + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + test -d "$dstdir" dstdir_status=$? fi fi - case $dstdir in - */) dstdirslash=$dstdir;; - *) dstdirslash=$dstdir/;; - esac - obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - posix_mkdir=false - # The $RANDOM variable is not portable (e.g., dash). Use it - # here however when possible just to lower collision chance. - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac - trap ' - ret=$? - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null - exit $ret - ' 0 - - # Because "mkdir -p" follows existing symlinks and we likely work - # directly in world-writeable /tmp, make sure that the '$tmpdir' - # directory is successfully created first before we actually test - # 'mkdir -p'. - if (umask $mkdir_umask && - $mkdirprog $mkdir_mode "$tmpdir" && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - test_tmpdir="$tmpdir/a" - ls_ld_tmpdir=`ls -ld "$test_tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + mkdir_mode= fi - trap '' 0;; + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; esac if $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else - # mkdir does not conform to POSIX, + # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in - /*) prefix='/';; - [-=\(\)!]*) prefix='./';; - *) prefix='';; + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; esac + eval "$initialize_posix_glob" + oIFS=$IFS IFS=/ - set -f + $posix_glob set -f set fnord $dstdir shift - set +f + $posix_glob set +f IFS=$oIFS prefixes= for d do - test X"$d" = X && continue + test X"$d" = X && continue - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ done if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true fi fi fi @@ -449,25 +450,14 @@ do else # Make a couple of temp file names in the proper directory. - dsttmp=${dstdirslash}_inst.$$_ - rmtmp=${dstdirslash}_rm.$$_ + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. - (umask $cp_umask && - { test -z "$stripcmd" || { - # Create $dsttmp read-write so that cp doesn't create it read-only, - # which would cause strip to fail. - if test -z "$doit"; then - : >"$dsttmp" # No need to fork-exec 'touch'. - else - $doit touch "$dsttmp" - fi - } - } && - $doit_exec $cpprog "$src" "$dsttmp") && + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # @@ -482,24 +472,20 @@ do # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - set -f && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && - set +f && + $posix_glob set +f && + test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else - # If $backupsuffix is set, and the file being installed - # already exists, attempt a backup. Don't worry if it fails, - # e.g., if mv doesn't support -f. - if test -n "$backupsuffix" && test -f "$dst"; then - $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null - fi - # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || @@ -507,24 +493,24 @@ do # to itself, or perhaps because mv is so ancient that it does not # support -f. { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 @@ -533,9 +519,9 @@ do done # Local variables: -# eval: (add-hook 'before-save-hook 'time-stamp) +# eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" +# time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: From 4673fa8f2be983f2f88d5afd754adb1a2a39ec9e Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 8 Apr 2022 04:40:40 +0000 Subject: [PATCH 059/287] upstream: two defensive changes from Tobias Stoeckmann via GHPR287 enforce stricter invarient for sshbuf_set_parent() - never allow a buffer to have a previously-set parent changed. In sshbuf_reset(), if the reallocation fails, then zero the entire buffer and not the (potentially smaller) default initial alloc size. OpenBSD-Commit-ID: 14583203aa5d50ad38d2e209ae10abaf8955e6a9 --- sshbuf.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sshbuf.c b/sshbuf.c index 368ba7980..840b899b1 100644 --- a/sshbuf.c +++ b/sshbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.c,v 1.15 2020/02/26 13:40:09 jsg Exp $ */ +/* $OpenBSD: sshbuf.c,v 1.16 2022/04/08 04:40:40 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -109,6 +109,8 @@ sshbuf_set_parent(struct sshbuf *child, struct sshbuf *parent) if ((r = sshbuf_check_sanity(child)) != 0 || (r = sshbuf_check_sanity(parent)) != 0) return r; + if (child->parent != NULL && child->parent != parent) + return SSH_ERR_INTERNAL_ERROR; child->parent = parent; child->parent->refcount++; return 0; @@ -177,7 +179,8 @@ sshbuf_reset(struct sshbuf *buf) buf->off = buf->size; return; } - (void) sshbuf_check_sanity(buf); + if (sshbuf_check_sanity(buf) != 0) + return; buf->off = buf->size = 0; if (buf->alloc != SSHBUF_SIZE_INIT) { if ((d = recallocarray(buf->d, buf->alloc, SSHBUF_SIZE_INIT, @@ -186,7 +189,7 @@ sshbuf_reset(struct sshbuf *buf) buf->alloc = SSHBUF_SIZE_INIT; } } - explicit_bzero(buf->d, SSHBUF_SIZE_INIT); + explicit_bzero(buf->d, buf->alloc); } size_t From aa1920302778273f7f94c2091319aba199068ca0 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 8 Apr 2022 05:43:39 +0000 Subject: [PATCH 060/287] upstream: Note that curve25519-sha256 was later published in RFC8731. ok djm@ OpenBSD-Commit-ID: 2ac2b5d642d4cf5918eaec8653cad9a4460b2743 --- PROTOCOL | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/PROTOCOL b/PROTOCOL index 2d50b5cb0..f4735795c 100644 --- a/PROTOCOL +++ b/PROTOCOL @@ -102,6 +102,8 @@ OpenSSH supports the use of ECDH in Curve25519 for key exchange as described at: http://git.libssh.org/users/aris/libssh.git/plain/doc/curve25519-sha256@libssh.org.txt?h=curve25519 +This is identical to curve25519-sha256 as later published in RFC8731. + 2. Connection protocol changes 2.1. connection: Channel write close extension "eow@openssh.com" @@ -649,4 +651,4 @@ master instance and later clients. OpenSSH extends the usual agent protocol. These changes are documented in the PROTOCOL.agent file. -$OpenBSD: PROTOCOL,v 1.44 2022/03/31 03:05:49 djm Exp $ +$OpenBSD: PROTOCOL,v 1.45 2022/04/08 05:43:39 dtucker Exp $ From cd1f70009860a154b51230d367c55ea5f9a4504e Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 11 Apr 2022 22:52:08 +0000 Subject: [PATCH 061/287] upstream: clear io_want/io_ready flags at start of poll() cycle; avoids plausible spin during rekeying if channel io_want flags are reused across cycles. ok markus@ deraadt@ OpenBSD-Commit-ID: 91034f855b7c73cd2591657c49ac30f10322b967 --- channels.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/channels.c b/channels.c index ee3c78792..d47af7911 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.415 2022/03/30 21:10:25 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.416 2022/04/11 22:52:08 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2601,7 +2601,12 @@ channel_prepare_poll(struct ssh *ssh, struct pollfd **pfdp, u_int *npfd_allocp, u_int i, oalloc, p, npfd = npfd_reserved; channel_before_prepare_io(ssh); /* might create a new channel */ - + /* clear out I/O flags from last poll */ + for (i = 0; i < sc->channels_alloc; i++) { + if (sc->channels[i] == NULL) + continue; + sc->channels[i]->io_want = sc->channels[i]->io_ready = 0; + } /* Allocate 4x pollfd for each channel (rfd, wfd, efd, sock) */ if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved) fatal_f("too many channels"); /* shouldn't happen */ From d2b888762b9844eb0d8eb59909cdf5af5159f810 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 16 Apr 2022 14:31:13 +1000 Subject: [PATCH 062/287] Retire fbsd6 test VM. It's long since out of support, relatively slow (it's i686) and the compiler has trouble with PIE. --- .github/workflows/selfhosted.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index ec2c29825..5ee9c0fe3 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -25,7 +25,6 @@ jobs: - dfly48 - dfly58 - dfly60 - - fbsd6 - fbsd10 - fbsd12 - fbsd13 @@ -58,7 +57,6 @@ jobs: - { os: dfly48, configs: pam } - { os: dfly58, configs: pam } - { os: dfly60, configs: pam } - - { os: fbsd6, configs: pam } - { os: fbsd10, configs: pam } - { os: fbsd12, configs: pam } - { os: fbsd13, configs: pam } From 53f4aff60a7c1a08a23917bd47496f8901c471f5 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 16 Apr 2022 14:33:20 +1000 Subject: [PATCH 063/287] Resync moduli.5 with upstream. 1.18: remove duplicate publication year; carsten dot kunze at arcor dot de 1.19: ssh-keygen's -G/-T have been replaced with -M generate/screen. --- moduli.5 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/moduli.5 b/moduli.5 index ef0de0850..5086a6d42 100644 --- a/moduli.5 +++ b/moduli.5 @@ -1,4 +1,4 @@ -.\" $OpenBSD: moduli.5,v 1.17 2012/09/26 17:34:38 jmc Exp $ +.\" $OpenBSD: moduli.5,v 1.19 2022/04/16 04:30:10 dtucker Exp $ .\" .\" Copyright (c) 2008 Damien Miller .\" @@ -13,7 +13,7 @@ .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -.Dd $Mdocdate: September 26 2012 $ +.Dd $Mdocdate: April 16 2022 $ .Dt MODULI 5 .Os .Sh NAME @@ -32,12 +32,12 @@ using a two-step process. An initial .Em candidate generation pass, using -.Ic ssh-keygen -G , +.Ic ssh-keygen -M generate , calculates numbers that are likely to be useful. A second .Em primality testing pass, using -.Ic ssh-keygen -T , +.Ic ssh-keygen -M screen , provides a high degree of assurance that the numbers are prime and are safe for use in Diffie-Hellman operations by .Xr sshd 8 . @@ -123,5 +123,4 @@ that best meets the size requirement. .%D March 2006 .%R RFC 4419 .%T Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer Protocol -.%D 2006 .Re From 21042a05c0b304c16f655efeec97438249d2e2cc Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 12 Apr 2022 05:09:49 +0000 Subject: [PATCH 064/287] upstream: Correct path for system known hosts file in description of IgnoreUserKnownHosts. Patch from Martin Vahlensieck via tech@ OpenBSD-Commit-ID: 9b7784f054fa5aa4d63cb36bd563889477127215 --- sshd_config.5 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sshd_config.5 b/sshd_config.5 index 3a4ffab7c..e33aedebb 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.340 2022/03/31 17:58:44 naddy Exp $ -.Dd $Mdocdate: March 31 2022 $ +.\" $OpenBSD: sshd_config.5,v 1.341 2022/04/12 05:09:49 dtucker Exp $ +.Dd $Mdocdate: April 12 2022 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -817,7 +817,7 @@ should ignore the user's during .Cm HostbasedAuthentication and use only the system-wide known hosts file -.Pa /etc/ssh/known_hosts . +.Pa /etc/ssh/ssh_known_hosts . The default is .Dq no . .It Cm Include From 69928b106d8f0fa15b88cf3850d992ed81c44ae0 Mon Sep 17 00:00:00 2001 From: "tj@openbsd.org" Date: Sat, 16 Apr 2022 00:22:31 +0000 Subject: [PATCH 065/287] upstream: list the correct version number for when usage of the sftp protocol became default and fix a typo from ed maste OpenBSD-Commit-ID: 24e1795ed2283fdeacf16413c2f07503bcdebb31 --- scp.1 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scp.1 b/scp.1 index 3af6ece1e..2e96e2011 100644 --- a/scp.1 +++ b/scp.1 @@ -8,9 +8,9 @@ .\" .\" Created: Sun May 7 00:14:37 1995 ylo .\" -.\" $OpenBSD: scp.1,v 1.108 2022/02/23 21:21:16 djm Exp $ +.\" $OpenBSD: scp.1,v 1.109 2022/04/16 00:22:31 tj Exp $ .\" -.Dd $Mdocdate: February 23 2022 $ +.Dd $Mdocdate: April 16 2022 $ .Dt SCP 1 .Os .Sh NAME @@ -295,9 +295,9 @@ is based on the rcp program in .Bx source code from the Regents of the University of California. .Pp -Since OpenSSH 8.8, +Since OpenSSH 9.0, .Nm -has use the SFTP protocol for transfers by default. +has used the SFTP protocol for transfers by default. .Sh AUTHORS .An Timo Rinne Aq Mt tri@iki.fi .An Tatu Ylonen Aq Mt ylo@cs.hut.fi From e68154b0d4f0f5085a050ea896955da1b1be6e30 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 20 Apr 2022 01:13:47 +0000 Subject: [PATCH 066/287] upstream: Import regenerated moduli OpenBSD-Commit-ID: f9a0726d957cf10692a231996a1f34e7f9cdfeb0 --- .skipped-commit-ids | 1 + 1 file changed, 1 insertion(+) diff --git a/.skipped-commit-ids b/.skipped-commit-ids index c606eaee6..b63967893 100644 --- a/.skipped-commit-ids +++ b/.skipped-commit-ids @@ -24,6 +24,7 @@ d9b910e412d139141b072a905e66714870c38ac0 Makefile.inc cc12a9029833d222043aecd252d654965c351a69 moduli-gen Makefile 7ac6c252d2a5be8fbad4c66d9d35db507c9dac5b moduli update 6b52cd2b637f3d29ef543f0ce532a2bce6d86af5 makefile change +f9a0726d957cf10692a231996a1f34e7f9cdfeb0 moduli update Old upstream tree: From fec014785de198b9a325d1b94e324bb958c5fe7b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 20 Apr 2022 04:19:11 +0000 Subject: [PATCH 067/287] upstream: Try to continue running local I/O for channels in state OPEN during SSH transport rekeying. The most visible benefit is that it should make ~-escapes work in the client (e.g. to exit) if the connection happened to have stalled during a rekey event. Based work by and ok dtucker@ OpenBSD-Commit-ID: a66e8f254e92edd4ce09c9f750883ec8f1ea5f45 --- channels.c | 11 +++++------ clientloop.c | 7 +++---- serverloop.c | 5 ++--- 3 files changed, 10 insertions(+), 13 deletions(-) diff --git a/channels.c b/channels.c index d47af7911..12f765997 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.416 2022/04/11 22:52:08 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.417 2022/04/20 04:19:11 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2420,6 +2420,9 @@ channel_handler(struct ssh *ssh, int table, time_t *unpause_secs) c = sc->channels[i]; if (c == NULL) continue; + /* Try to keep IO going while rekeying */ + if (ssh_packet_is_rekeying(ssh) && c->type != SSH_CHANNEL_OPEN) + continue; if (c->delayed) { if (table == CHAN_PRE) c->delayed = 0; @@ -2610,17 +2613,13 @@ channel_prepare_poll(struct ssh *ssh, struct pollfd **pfdp, u_int *npfd_allocp, /* Allocate 4x pollfd for each channel (rfd, wfd, efd, sock) */ if (sc->channels_alloc >= (INT_MAX / 4) - npfd_reserved) fatal_f("too many channels"); /* shouldn't happen */ - if (!ssh_packet_is_rekeying(ssh)) - npfd += sc->channels_alloc * 4; + npfd += sc->channels_alloc * 4; if (npfd > *npfd_allocp) { *pfdp = xrecallocarray(*pfdp, *npfd_allocp, npfd, sizeof(**pfdp)); *npfd_allocp = npfd; } *npfd_activep = npfd_reserved; - if (ssh_packet_is_rekeying(ssh)) - return; - oalloc = sc->channels_alloc; channel_handler(ssh, CHAN_PRE, minwait_secs); diff --git a/clientloop.c b/clientloop.c index f8350e672..1d80683c0 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.378 2022/01/22 00:49:34 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.379 2022/04/20 04:19:11 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1348,9 +1348,8 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg, if (quit_pending) break; - /* Do channel operations unless rekeying in progress. */ - if (!ssh_packet_is_rekeying(ssh)) - channel_after_poll(ssh, pfd, npfd_active); + /* Do channel operations. */ + channel_after_poll(ssh, pfd, npfd_active); /* Buffer input from the connection. */ if (conn_in_ready) diff --git a/serverloop.c b/serverloop.c index 0541f028a..b4c0d82b2 100644 --- a/serverloop.c +++ b/serverloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: serverloop.c,v 1.231 2022/01/22 00:49:34 djm Exp $ */ +/* $OpenBSD: serverloop.c,v 1.232 2022/04/20 04:19:11 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -392,8 +392,7 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt) cleanup_exit(255); } - if (!ssh_packet_is_rekeying(ssh)) - channel_after_poll(ssh, pfd, npfd_active); + channel_after_poll(ssh, pfd, npfd_active); if (conn_in_ready && process_input(ssh, connection_in) < 0) break; From f1233f19a6a9fe58f52946f50df4772f5b136761 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 20 Apr 2022 01:13:47 +0000 Subject: [PATCH 068/287] upstream: Import regenerated moduli OpenBSD-Commit-ID: f9a0726d957cf10692a231996a1f34e7f9cdfeb0 --- moduli | 801 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 419 insertions(+), 382 deletions(-) diff --git a/moduli b/moduli index 1362f20e1..c580e1773 100644 --- a/moduli +++ b/moduli @@ -1,383 +1,420 @@ -# $OpenBSD: moduli,v 1.31 2021/09/28 11:10:05 dtucker Exp $ +# $OpenBSD: moduli,v 1.32 2022/04/20 01:13:47 dtucker Exp $ # Time Type Tests Tries Size Generator Modulus -20210524220022 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F806ABBEB -20210524220025 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F807D248B -20210524220034 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F80D9BC9F -20210524220041 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F812A0A37 -20210524220046 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F8155AB97 -20210524220054 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F81B2848B -20210524220056 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F81C13007 -20210524220118 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F82930D03 -20210524220122 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F82BE877B -20210524220127 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F82EBBF97 -20210524220132 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F8320C043 -20210524220137 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F83476BCB -20210524220154 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F83FA204B -20210524220159 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F842A67EB -20210524220217 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F84E7FEDB -20210524220251 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F86503997 -20210524220256 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F867E7587 -20210524220301 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F86A47F7B -20210524220302 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F86A754D3 -20210524220304 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F86BFB23F -20210524220310 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F86F871FB -20210524220313 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87125B7F -20210524220316 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87290AD7 -20210524220323 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F876DECFB -20210524220330 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87B31B33 -20210524220332 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87BD0977 -20210524220333 2 6 100 2047 5 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87C5168F -20210524220335 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87D5CCB3 -20210524220337 2 6 100 2047 2 C117F4B631CA032FD2F00AC0D9A5473D8E56DA246FC44FD594BF5657D399E453728341CC920EE9127729637683D268CA3B62F5CB61C7D4F08D3F202D67DBBBD88498043861190549649D82E7793A1874FE0E8ED0B460E3442DD4DFC2301A1B6D8FA36C7CAD084B2FFEF2205E3CE46B030E4618C7B50656BF9FB60592B1FA32E91E0D536A12E601317F0562F547FF44DF33377ABAB2A2991EC99887712BFD9C78BBAA8759B09577706493F50A416F472D6F7B9532959A8899FACEB55B012E8FE8131AA45E1851FFAA3572E489FF4AAE89ECB583C98CC29ADBB1E9677AE2517D6BC1BC13C5A18A232FAD4CDC6E580FEC730D070D49E88A23C528A4985F87DBEA23 -20210524220355 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A44F8E93 -20210524220404 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A4A0C6AF -20210524220412 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A4EF1E03 -20210524220414 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A4F93C23 -20210524220420 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A535963B -20210524220424 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A5566833 -20210524220425 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A5599617 -20210524220426 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A55EC4A7 -20210524220436 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A5BD5EB7 -20210524220445 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A619258B -20210524220451 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A650122B -20210524220501 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A6B04DA7 -20210524220513 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A725B467 -20210524220528 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A7C40A4B -20210524220537 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A825DA4F -20210524220559 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A906849F -20210524220603 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A92B2543 -20210524220606 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A946A62B -20210524220611 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A96E9F73 -20210524220612 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A9741957 -20210524220613 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A977BF53 -20210524220614 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A9808FE3 -20210524220616 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A994D8CB -20210524220618 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A99CAF0B -20210524220624 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A9D53ABF -20210524220627 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01A9F1F75B -20210524220644 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AAB771E7 -20210524220645 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AAB8D6C3 -20210524220650 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AAE8CD27 -20210524220652 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AAFAE557 -20210524220656 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AB231D03 -20210524220658 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AB2F512F -20210524220700 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AB3ED6AF -20210524220706 2 6 100 2047 5 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01AB7A3DDF -20210524220712 2 6 100 2047 2 CDA33E2E7179C731632DFF6272815DAAC78E971B46095FA70FD7153B8FEC3061C37064D6D6961EA44D04D20222E7071AF123319EE4B70C6C6C7F5EC5BF6F4556A9636794FE249A109E9292CAE57FE40829089D99A5731AC08639F090500DAA9ECD8D56C83368EA05DEB9A1C37C82C0E84396128BF47B2222A7312DC06F7220DB671F16302E8C9ACEB9034E4955EC08E27C9E708FF81884B81CFB3DD2D662D0A60A5DAA91EBD69F564B8B2A565637663A4D444BA4BBEE7F029BB44AE1EA2182F39A1E2ABFDE297432932295FCF1DB704EFCD3A30A9EF881D6090480232D8893B9F7608037E1B5A2A09DD9E590C63ED28A82EFF89135E05E010710FC01ABB48B1B -20210524221547 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505902F721263 -20210524221723 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059030ED9F9B -20210524221800 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903179F84F -20210524221940 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB850590331E399B -20210524222007 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB850590338E4BEB -20210524222013 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB850590339E72DB -20210524222057 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903458ADC7 -20210524222125 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059034C60DC3 -20210524222149 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903527AD67 -20210524222206 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB850590356715BF -20210524222226 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059035B2AF7F -20210524222240 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059035E27D63 -20210524222530 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059038AD337F -20210524222550 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059038FF50F7 -20210524222711 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903A587DBB -20210524222722 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903A7E2593 -20210524222813 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903B518C67 -20210524222821 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903B6BA4B3 -20210524222927 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903C7ADF53 -20210524222944 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903CB9378F -20210524223124 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903E4E0F63 -20210524223132 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505903E680D03 -20210524223318 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505904017708B -20210524223328 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059040391D6B -20210524223340 2 6 100 3071 5 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB8505904064990F -20210524223418 2 6 100 3071 2 C1064E3791D96D66CA94320FDDA0DD731891FE4D4E4BCB5C8C2A22E33BE0C071BDD6B55DF0A474F1123F6AA3CDBB043EE9972052E3422BAAF9CBB6C1E77E2817F0266F0018351110EE2017EDE4312F0E0ABECA6585F15630FE2228BC03E4DEC84F31650177D712CDE77D6D6D2B0B391F64CD792A6C14BF9A16011EE673183465882595613087535464AC29A1138E1FB2B1024693A368700447307B43435E1BC718CD239396943F22BBF861EA0098069CAB7976B13C60A9CDD4BEDE6DF3659D61188E161D2D5A02CADDCCB547319E02211D00445BE47F5484F673239D7796CB1E1D3FF1558DA0ACD3AB17C6B3D8C3F00DFBBBF69F3B600E98DDC1FB0C0F79FC2E2F88C891F7BACAD4023331B623DF6835B2A7E881E59F0B7CE676208717E3AA51FBEDD7E9EE62527F253762C7B6A3D987DF800D2FB66DFE4F9588BEAA938DD9FAA5916186746FBC25A357F57D0E03442EEA6D067F19ABB96865474A250C73F66FE0FC5B5847CAB8F2CE25765A52A27223BD725C7ECFCF55EAAB85059040FCE473 -20210524223453 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB455657B -20210524223634 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB5FCC833 -20210524223659 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB65DD6F3 -20210524223732 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB6E02573 -20210524223739 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB6F4ED87 -20210524223745 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB7068FBB -20210524223826 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB7A2859B -20210524223848 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB7EE3B1B -20210524223936 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB8AE2333 -20210524224015 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB93EC75B -20210524224018 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EB944D10F -20210524224136 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBA7C4FC7 -20210524224213 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBB023E7F -20210524224228 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBB36560F -20210524224236 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBB4F6853 -20210524224323 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBC0F75BB -20210524224346 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBC62CB7B -20210524224413 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBCC9AD0B -20210524224441 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBD2F9967 -20210524224508 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBD92D627 -20210524224722 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBF92432B -20210524224733 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EBFB7A837 -20210524224832 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC09EA30F -20210524224841 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC0B86AD3 -20210524224843 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC0B88DBF -20210524225050 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC2C17DEB -20210524225054 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC2C967DB -20210524225112 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC30CDA43 -20210524225123 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC3311D0F -20210524225247 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC4813D2B -20210524225254 2 6 100 3071 2 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC4923E73 -20210524225346 2 6 100 3071 5 C6D582E2863DD842704EDE65181452A2A54FD6112537B792F2AF066D30656086948D10BD502D46881AA1766656F36A4BDDCCAF0893BA661A1E7952ED0CC9FD481640C27E1513322DA51E6CF68B2659BFED70ACA5F3D45188E2DCE57C05479C7564EB1573D3A039E815105E5BED13E0810D70E388766005C2DE1ADA9855EB53BF83EFABFCB67D8BDC4156C639A547EBDCB3EB980DCD81A44255F1EFCEAE2367482CD7AC7C7B68CA9536B6548F5323C1F46C9ADB084274D82387B7005D7D964CF53F4FCD2EF3337466DEB47BF46DA8501BCDAC4579FE0512B1D6C2AFDF933E9C6B89B25CCD5066B103D59FF1CB96DD4E427520CC06DEE74325885FD48E20E6DA45009CFD337511AF8081C2BC4341306DB2F2BFEB6912F7176D07161162D1BF8B603B0500EDAE3985D29BE88F3F94E98F91A73BA3CCAD9F35EBF6F95F179DA44AD4255AE983FBF8A8BD9458ED7D3AC7E410735FF90ECB32029C5A7D562A33C295F6262E6E91AA15444B971D565A6F90CD898E700B4EE15FE1ADABD3EA6EC562D397 -20210524230435 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375A8B66EEB -20210524230743 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375AA1B04D7 -20210524231138 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375ABDA60AB -20210524231337 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375ACBB313B -20210524231610 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375ADDB3D53 -20210524231810 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375AEB7413F -20210524231830 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375AED5921B -20210524231850 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375AEF2A0D7 -20210524232438 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B19B5B17 -20210524232556 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B23127DB -20210524233441 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B624C5D3 -20210524233915 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B81FBBEF -20210524234022 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B89ABD27 -20210524234251 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B9AA7603 -20210524234341 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375B9FF196B -20210524234859 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375BC541C47 -20210524234945 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375BCA418EB -20210524235116 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375BD49C877 -20210524235639 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375BFB1B0BB -20210524235928 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C0F703EB -20210525000202 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C21C5393 -20210525000215 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C22B072B -20210525000220 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C22DB943 -20210525000241 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C24E57CF -20210525000519 2 6 100 4095 5 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C37CDA8F -20210525000617 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C3E42EBB -20210525000910 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C52F623B -20210525000950 2 6 100 4095 2 DF313B012B87BCB41D4138171AA4A3ACBBCE90E58F3142966241384A0C0FFB78A3AAF92DFD19BAEF944D6323266A2BF7DAD5B917587B37D446A09EC84E519C10C981F1F59D7BF098A174589ACE1272D2BEDBC6703AE8F728E2EEC81F0C8F5E3E77991C632A664FAB45A584FD7A34133DB362EC04B2EFC6EC3F6C609C3ECEFB6223BA4CF06792D3A623F8FA4E1C78603B22B8AF856C8435AA6B25EEEB5C90F24572236182A79EE6A31331B4A78F1EFDE526AE53EA6C30F93DC2AEB3790E8AA728CE26D13080F84CC81ABB03E8E8E653368825D488461676BACF9BAAEDDA84A2E0E3524F407DD717A1DEC0D46C8FCF63F6F8952BCF1B19C03425F5AAB759ECD3C1E943756694A0F32CB0F765FB5EE410AFA6BAA30B0C96F4E65C76741BD067048DFF657B4C7C43336F200951448F3348AD241D9EBA14EE8CD8C023EF049835B6F6A6A4BA8B45CFF29C5252521494750C51972D2D448E357EA1B5A7230DCEFE9F2404E1D1C857E2DBFA18ABEA6369D958870D5657E3C6465748E2E10F851F9301B26F0A4AEF77F134C52A9391F7C92783FD7A2E378B5CE9F6D0ADA2B1EADC9BC9959E30E3821B2473DC1E2F3529DAE96B9E09BB0BC7806F41D7F39CEC690DB9F3DCCDFD92FA5DBF29FA26E5F55D87ED627E7788120A76ADDF2F2F28323F0950E1D9EAAC4270A6D66269978BB7382055BE7C36CE63446899C7ADF725F375C573F39B -20210525001816 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FBF7D2A3 -20210525001921 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FC6DAC53 -20210525001926 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FC6F3373 -20210525002309 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FE12C677 -20210525002320 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FE1E59AB -20210525002338 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FE3AB02F -20210525002359 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FE5BF4C3 -20210525002601 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB091FF3C869B -20210525002851 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09200739083 -20210525003041 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920140797B -20210525003049 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092014502F3 -20210525003141 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09201A2B9FF -20210525003223 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09201EA8A9B -20210525003231 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09201F326F3 -20210525003352 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092028EFD83 -20210525003809 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920482BA13 -20210525003923 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09205072CA3 -20210525004024 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09205780163 -20210525004148 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920617E947 -20210525004457 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092077D9FDB -20210525004558 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09207ED990B -20210525004731 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092089EB6C3 -20210525004805 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09208D77E3B -20210525004822 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09208EF6DA3 -20210525005103 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920A21B82B -20210525005232 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920AC6072B -20210525005335 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920B39092B -20210525005400 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920B611A73 -20210525005804 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920D2EF2A7 -20210525005836 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0920D66062F -20210525010525 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921066C17F -20210525010559 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09210A11893 -20210525010655 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921101CC03 -20210525010715 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092111F033F -20210525011027 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921284AEC3 -20210525011247 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092138697D7 -20210525011345 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09213EAC66B -20210525011758 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09215CA5E7F -20210525011827 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09215F9F6DB -20210525011950 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092168F25FB -20210525012059 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09217019A9B -20210525012441 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB092189F6357 -20210525012731 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB09219DE687B -20210525012806 2 6 100 4095 5 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921A19486F -20210525012959 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921AE8C22B -20210525013036 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921B277E7B -20210525013100 2 6 100 4095 2 D26A87E5A681F2A0E0231EC9449860176D2F9282C1D6E791D912B84987AAEF8BBCDE27FCC3A31FD76A78509ACB3673A0091330E077333D6682329E65ED16DAB1DC98ED93D911BCC3B63FF1271937AE5CE43688C0322530126BCC852EBA388F6B5B9AFF6808DD0B17790AD76F462EA9F0438F1E5A622C921E50A0358335806DD4A574C8117028E6DD07A42F09C3CDE7B5B9CD8914CEE9116E2F952862EFDB94F826D826C8EF15C468E80F916E09F4C411483E2C3CBDBF1CEE282F1144D17F9F681B0B238337941C1C5DEAB7DD52F0EC84A5C8B9FEEF5AA7EEA118FDF857B8BC0190C81A8D2E446E58C5F18DE1CFDD4680E04C89D421E1DEF67BC5A6FBA6B525FB06C263624A5D668A36F2254F9ADC7366544CE3A388B31675E3886801F9DFB571BA159C7D20B6175711387D696741F64FD689DC61F775028924BCCFC0197844340F61BB7EF0370B3FA53CFEEF65B4058B4CA1B25290DEB7E9ED829154430B7008A5E4174FCCAD783F3C8D1CE61014AF4299527B81B9F4D6EA4DEDEE89DD042FBDB6F0ED861CD7073F59AE181C5922BF8B480F7C71E2EC6CB6EA922FBA8C7383AA72001AA4A0AF633CD82D423B880E4AA3B96921BA8CE3EAB0337BAF49F37576905D811D657E3420C8C41C9BC693ACA6C94B34102F54FB370D597A1F9C00ED602927871F79C396D778FA4C968D2CD48788196EFB9511315087B9AEB0921B4B1893 -20210525015106 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081BF2FBF4B -20210525015719 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081C01C9317 -20210525022943 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081C51E7ABF -20210525025621 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081C92AC0FF -20210525030139 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081C9F26EFB -20210525030310 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081CA22ECE3 -20210525033123 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081CE69BC83 -20210525035425 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081D1EA340F -20210525042046 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081D5E1F147 -20210525044151 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081D906177B -20210525045703 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DB34C7EB -20210525050443 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DC53F8C7 -20210525050557 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DC7921BB -20210525051327 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DD90DF33 -20210525051635 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DE04D46F -20210525052745 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081DFAB207B -20210525053701 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081E102FFA3 -20210525060524 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081E525193F -20210525061916 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081E723D123 -20210525062421 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081E7DAEAA3 -20210525062728 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081E8449753 -20210525064313 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081EA8CAE5B -20210525072251 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081F04FCEC3 -20210525082731 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081F9AA3067 -20210525090241 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB3081FEACB11B -20210525093810 2 6 100 6143 2 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB308203BF9E43 -20210525094831 2 6 100 6143 5 CAED937BA3084DFE7B4C1B59AC23C7EA9F28E677B8AFA536E9079DECED93EDAAEFB2C757F9E7AE4E90C4C68C8C937CAA8A0FB92A36FBBD24F777D579E264E8750B365A59AF83C5925262981B301C94CA57CE2A4825438EE089B2E0A5A8D90B51B7DB6044383542685F2D543030403741A6337C0280866A08D15BBFF32D9326073E6F8BAE510E66CF5A5DC6C7D96EFA13984EA383224CD59C7F8A49BA170EBD0BCF896FAD0FD67AB88D4D25CC81D29FFB7062328C9BA3BCD7EB107B74FAC05412D7677C058604F544B2EE8548E9372064C0CEB79BADEF8755F86E8DC894BD043DE697ECE323D624156B731D99C12FD1F42BB2FCADF8CFFEAB8DB59F9CB5843C1A01018DB3E415B4BF00D7F3F20FAAD86938C6B3061BC2A4ED0D18FAD01B1E53D0C8D41D208189D6E341E167B4B975236701B76C72097A34AAC46F4781185A7A63E4FB4A3CDDAB793EE4DFBA3D57481AF41ACD06A45F8D59D33FEBABCD3B98675A9C3F54B0AB42CFCABCA47021C709867AB12F830C4E93AE48AE5EBDD109E3F672AAE6A2EFFEAF07648D3110EE52627D44C8EA35482502C1CDC7B655F4D4A5E7DA1A064E138D00A9CC85DA5E833221AC5FF62F7871B53A8CE279AD441A5795D092F257C9BD2A871D098B3583ED9876342351C063BC2EA9FF111D245FE68A6A087B9E0B7AB0C47F2C6BD98A5CB4DFC57B71A1CF13A83308DA1E3BEB572AFDA9B88F05CCE1DBE359A44E849CAE4AB6196262877B119EDF241326C0F523ACF04DDF90601DC0D4107B935444D5C9E019B340227A386996D071BAA64D62FA049F285F12366ACDD439FCD3D0BAF9C37519177AAC6CF3B6986BAB5F68BDC9FB6E3B82FA157BE36D452FC0EDC4CDB95F9677F97C0F98725F275EAE0FF15C53957D1EFA9CABCE7B68FC186F117C40C5D24BD982A7F21AD6FE4A9CAC6C763FB68DD0B1C725E5DBC4522B86A42B02E3F5E704595977829607FDEB0922C497A9A93F327FA921D8BFBCD9C18272506A1A9F23171787FCBA72E4670C857D089DB5A22AE801EEBD567D48D697EBF25E6183374FC4C47C1747C3F69E650333F6F7ABEB30820532247F -20210525101346 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7A84C1DCF -20210525102328 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7A9C0F78B -20210525102507 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7A9F844D3 -20210525105019 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7ADB803E7 -20210525110206 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7AF734957 -20210525110823 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7B0605EAB -20210525113051 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7B3C762EB -20210525114458 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7B5E9D203 -20210525120436 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7B8DCCD03 -20210525120944 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7B9A11BE3 -20210525122534 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7BBFCC14F -20210525140523 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7CAD4CEEB -20210525141051 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7CB96ECE3 -20210525141705 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7CC76C197 -20210525145447 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7D1FC10C3 -20210525152246 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7D605451B -20210525153139 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7D73E819B -20210525153550 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7D7D225C3 -20210525161421 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7DD5B0F27 -20210525163744 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7E0BFFE7B -20210525165044 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7E29682EB -20210525172301 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7E730C6C3 -20210525172835 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7E7F17D9F -20210525173319 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7E89CD397 -20210525174552 2 6 100 6143 2 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7EA6442E3 -20210525175415 2 6 100 6143 5 E14FDFEE7787F1C28112A16D64FE7C953E3A963B98675E5C078465D774DDD60D0689616D88E223B1D75C4D124BD32324D828137D8AF145AED00162977FA394F7D9657F5E892CDAC98461E41CCF76B3F42471E8DC112FB82F65AD55AE55ADE7F3B85C9EE6E914F2DEE618D55A9FA0F72F6C03664BCDAEDC64ACD9DAE85B0396321F79565522DE272B5D041155C8949BE08B5B09712887BE1E20C31FE5A5A90E0F9610000EF7E1BBA8C7EF3A9F7E3BD2710BCA36C5390673FC55FC47CF63A356472C491229E283A236DB444E75BCD2F43B0FF35B809E6336314945B725912A1C3423141007FFC129C65CCD772966D9E394AECC3252F9C9AD019950C188FE8922A959E19F226B33235BA30D0F3B163F21BE8964C67D0CD118EB7EDBE0DB21762006A115ECCF829452B51E533AC29A836DC6CF40135FCB31B77A287E5CD377A0A80D7F2683A9D9E760F3EA479CFCE9627AFF5BF6AEC257043D71E0CC695D2DF4589C3255DBA1A2F58FA3F673C23FEF80366042BC0DBD7AE2556E3EA38577FC0CA9D56324CB084E6EBE01ADFAD00AB41CF94822FC7680A9007A6BA804A2242E8EDE7D599A46F59886D36E6B7F4AA20D92E682AFC1BB0BD5F5AC0203185B978F438508933EE2A85666467A95051DF1EA0C6366CC28D36030242A4B51820D043190B310D5D51DCE6A6AF333629FAEE5F3A6D88DDC325321A3767CF1C97B6B5FD8E2AC2E95C54F142BD4F5A5F5609E6D4BC09C55FA03F92BA35C006662FC08BEE197777F3E8CC1730F754447D349BF93AA8683D226EBD2FD872CB8383A03058AE9210891886DB9E4DB2300D109B2C32E26C460DA6E362F72214999EFDEED5E7299AA4C6A9DC9A9BB5A8D59374F92C339314BCEDFE44E5F805F37934C94FB6D8C8E2C9045BF0C1CE9A659A40937870F51F36947A89EA941990F743666D6B27C71CDF6366666E3623471945AB3F52F98C6034CE808AF2F10F21541A3B3C1CBF2A204770E10953F63913D1A5695C1A68E48D21F65C210097F931E4DD82A31BEE9EC842D8898A73CB84E236B8A10D3B7D8BE6097E4679CC8BE8C77A1CB824F6231E7EB8F5A57 -20210525183229 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816BFE560FB -20210525190732 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816C2E82C7B -20210525191937 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816C3EC147F -20210525193159 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816C4F60C8B -20210525194246 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816C5D97313 -20210525203443 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816CA459133 -20210525215204 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816D0DE4FDB -20210525233543 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816D9A29577 -20210525234619 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816DA7ADFAB -20210525235329 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816DB0B2673 -20210525235513 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816DB26C1CB -20210526022844 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816E7D6D73B -20210526023323 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816E82F077F -20210526062933 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FB41731B -20210526065151 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FCF0DCD3 -20210526070545 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FDF8DB8F -20210526071052 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FE572613 -20210526071809 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FEDF35F3 -20210526072107 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FF13DABF -20210526072624 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37816FF7318C7 -20210526081148 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F3781702F3953F -20210526081939 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378170385D3EF -20210526100857 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378170BEE7A0B -20210526104252 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378170E7ACB07 -20210526104946 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378170EFA920B -20210526105532 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378170F653A13 -20210526110401 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378171004A14B -20210526110925 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378171065B293 -20210526123113 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F37817168DDC17 -20210526123356 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F3781716B7D3FB -20210526135059 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378171C86775F -20210526162058 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F3781727B688EB -20210526173849 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378172D7A5213 -20210526175432 2 6 100 7679 2 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378172E9D4DF3 -20210526175746 2 6 100 7679 5 E3F4DC1A68758284B2950A16204A7D9CB3972B0E74E2CDF12518B48DA3F349640BFEDA5162CB2EC47E2593EDB3BB51D743F3F4948A4D940B37B724B6D7E5F5BFD44F9D3CFB0F6E2CC1B33AEB7FCA7C2E26EFC55208D15DD12B08925383346148CA7CEEE874499CBE6E5D34AF7EF47742F683398B5418E3FA261013922180C6EEB4250632A2F93CDC281E6E76A488FEB4CE7B4C9783A37201CE4B551B53EEBF291234454CD0A4DC1B78C2D0F1BF72EC5D64EDBE8CB662F373ED861194F02AFBC8B7133ED9BDDFEEBA8E7C19C58505DF691960346B4F9E0FC1076DE872E6CB4323B8AD7FB4B086B26E10A55ECEB23F6FE78A5224A0679E5EA529C1327D38EDCCD340788D6216D1388B33A8E93B41B0B13ECAB9B7D647BBFBA2181E752B9DE7230C13B38E0988CAD88E2B1F8B8B1C938B93BAD62F250289CE33E3BE77C04B8090B806B031C23413EAE7799E6FB6DFB02ACCD308EA8688245527ED4918ACE575748DC01C02A6420C9CEECCAF8CBA73F16282DEEC6697CF82C880E3FFC8FD149411C6AD19AAF3B30BF2EE89977B7536C9607777F6E4F6E83B84BB4D9B359EDA6A5A1167B6D352F4D6CCE10F2C974EB81CB1C75280406B2F891A7E500BD58648A5A88ACDD1A6D7A2D80690BB441E533171930ABA557A52BD2512E3FD9A3E5DE6A378E3FED42D6ED5480093D3B0E068F2A24B54FF43BEE12BDD5A646B4A2C1746C27328792A4B9528FB45F6AF56C6F917978B535D98C2441EE79D825E73BF97A7D49B5DC85B12B0C257DF6AF0907B771C5EA582C9DECDDC3CC1852AE403FDCA636DB4B111747646CF893260651567C4C63B391013CA9047AE7F77BCE46A16FBE54054CA8D74AE248A5C5A22B841D31B89C82C8D9567A03B249A07FC1CEFB03B569AB328B0028DA5F3D4D2E2BBE076D9DAAE0DA86DA2648E7311709D0A8C6083C42F9FE430418C2597BF533D294E15E53D5E045A95222A23F4CA7AC9FF35A0E1CBFB80227D800ADA8F79FE463F1C9FA0D8A4E9F6C42ACAB07B5A7CE6E1BB649264EF1EBBDE073A1892B3EDA5CF60D0921754A5848FE47F32168A094CAB1D242EF095BAAD113824511114B4714DDAAA585E3A653DEF46A70DB8D43E4813E6A03E5779B9A9194925CC967DF08F1EB9CEC35EA96BB3D78C40B0A4B8AA79D101CD8110E37119267CC3F2ADA62E3CA0F444C22CF5A73D46BBFDE56BBD1E4FC397A9D6975E77923B6E3AD4CAB4A4E3C5EEB01DC1B7690BF44197AAD7D1B802BB4F6494095E708F4A7F9642AAD64B0511037DC9A65663C4AA6046575A56226103E282B61286CFE6BD8672A3C297DB544E3CF08013BD2B32130D21E521351E9AA9F378172ED281E7 -20210526194658 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC72DF2567 -20210526205542 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC789BCF5B -20210526211855 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC7A83E6AB -20210526212819 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC7B4A5E7B -20210526214431 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC7CA4162F -20210526221404 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC7F1A2A03 -20210526224339 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC817DD633 -20210526232709 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC850A6253 -20210526233209 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8568303F -20210527003359 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8A7766A3 -20210527004505 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8B60FE03 -20210527005150 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8BE3BDCF -20210527010445 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8CE83F03 -20210527012302 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC8E564BAB -20210527031004 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC96F6A7D3 -20210527042035 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDC9C9071D3 -20210527051239 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCA0A5F80F -20210527054907 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCA382DD3B -20210527055430 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCA3E850B3 -20210527063343 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCA6FD9EFB -20210527071327 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCAA0EBEC7 -20210527071630 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCAA41FB57 -20210527080058 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCADACEDC3 -20210527085945 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCB22EE113 -20210527101619 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCB8016A93 -20210527102548 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCB8B44C67 -20210527105317 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCBAC26CAF -20210527111021 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCBC0189BB -20210527120037 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCBFCB4D7B -20210527120149 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCBFDA08E7 -20210527125327 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCC3B60853 -20210527125755 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCC4035243 -20210527133418 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCC6B03E83 -20210527141546 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCC9BF3B53 -20210527142810 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCAA21133 -20210527143703 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCB42B1A3 -20210527150004 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCCEFC0DF -20210527152242 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCE94F76B -20210527153438 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCF7614B7 -20210527153537 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCCF7F4B23 -20210527155914 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCD13EEF3F -20210527170116 2 6 100 7679 2 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCD5E5A47B -20210527171119 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCD6975A67 -20210527173152 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCD815F687 -20210527180427 2 6 100 7679 5 C32E7FEED6DD76E659C6961141AEC4C2E086F62A1B6FBB851A142301550CCFC2E424C3D4B1B518D97BB7DBA9B7E0E40408EA5CE767F9276D112391D7D777FC14537F787F3ADD0DA7A45B64E1330E8F7A0D23C5AFB283E766F2BD69FD286599C68CFF239900CB849E720800D52B4D7FDFBE94C6B920AFD4FE3BAB7C9F19193F96ADC0EDE471FCFCD27ABFF54EFD8F589FD4FD5DF45FC03F832C4B137F4AEAE448E9FEC83A8E1BE47FA202A243BE467219C94A5B28908635E9794C4A4D471E17297E5584CAC109082787C01B8C32C3B0D89006EABD02F17D8BAA792C71A3CA3563501206E70786FC09605B91365EBC2F31EAA94778BB63895FE13ECEBDD005255672ED2768ACAA24E317FC4D4204AEF9B69C0A7EE845B3C228A878D385BE603145DFA087D480A41AEDFA887F7B058BBBEE7D702D83611132FDDF37D0ED1D1731B905D73CDCEF06F9F2BE2A1D01099A915F545F8FFE9B42B66C5FF5DDF2CFCD38B50D45620A364650F12A6E9E94D398FBA738ED66C764901F475CC0DB8B328343180DC70E77BAFC3D8F5CD168A9D9985BA98DD632FB6691B178DE4C276FD5EADABB891680118D0F1234C21AE7788981A33AEEB5D357C28B87F82E4D7314C2A5C9C756541C9CA0C038CA03EB4A75324BBD8DEB5817EDBE6EC15FEEE0E94DBADB19DB0C53467935672C9E8DA879D83619277D37109F4002884B45A69693E5E5C0919BB3A11C89D0BDE5B944602222405EA03F1CB8B8C171C1BD01489E5690EFBFD69CE50A3C7D57FB83857B18B98FFC999D0CA1CA5BFE196485D03E6CD9DE2964091827CC7FBD6D4708D6E8C27BD38A40CF06F713544A1A862DC650F13148A039BE09E55765E27E70490EA8D5AB67009A5834ED6972FF8D76F57B4EEE311E2F395C12DF65FB0DB8F9DD405F0CFEDF3BF08C391E628A0230B6F0ABBB4D07EC644DBBFBD4F48F9A89756F1004873C3D9F20E3566B6B1A2E1ABB6C7152EFB099723469A3D4408D0C27106E09D483C705E50556A35691C99B108D5629A3BFF434A196868E460046B26F4D1FC9725A3470229BF840C86EE0FE1239AF1992C6F7E960CAD0E0D82839CB67318A084AE5BBD8CE513C4DE6EC95B74F8CABADCD825775C36247B07F2CBDCF45B6C3ABF0C4EFED04733309D6CFEBE37871B9A4180A84A822742CD47496C310BCECB574EBED53C0BFDE574D49F3E180EF575B1BFB8799434305FAB7CB970AF999407F262FDBC13CC1809B1F34A962FE8D1348D52780C4AA173E769E70CAC6D8C2E97BF92F7624B4631952FC07FAF93E43A1A8C869C3423BD9A9387CFB4B5B8B2D8475174CCA1AF38CC64E514F0281D65A9AEE4876EB7CDCDA776E0F -20210527185319 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F513E1A12F -20210527185735 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F51429194B -20210527213255 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F51F664F27 -20210527214610 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F52058B933 -20210528000741 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F52A61610F -20210528003717 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F52C738E73 -20210528014022 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F530CE1FFB -20210528020015 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F5322397AB -20210528050850 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F53F20EBA7 -20210528054438 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F5418B5C4B -20210528084340 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F54D8C79F3 -20210528091530 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F54FA20AAB -20210528094806 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F551BB35BF -20210528123059 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F55C74EE33 -20210528123356 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F55C9BEE33 -20210528131007 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F55EF35FB3 -20210528131122 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F55EFEBC1B -20210528133019 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F560345AEB -20210528174944 2 6 100 8191 5 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F570F3AF57 -20210528180427 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F571DF3C6B -20210528235428 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F587F3BDB3 -20210529021000 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F590536F63 -20210529024531 2 6 100 8191 2 F08476CF6891E7C1CE5A873D1D744FC41D579F53B1F877B0F280D44DF57BEBB3EFDEBC7B8DA48C885005E0F3D8167BE79FAA61DA67EAB112C599882D369A7446FFB888D483317B6A7E0A6AC0CCB6ADD70D511AD81FDCDD71D40C5A40B3627872CE2EDD092B2ED810F6F5F3AE3C02D97856002D646C750910C9B6917615BA8D8D0345514B5F7B37EF910BE98C8E42FF9F9C2FE04F3252C2894D67A033AB22CA3B1BFA9FEB208509654755F3B83121AB827BC481F2E435F68EA144ECCC19670F5C234369F97461A9AFEAE48917B2D767E925D3B94C6380F4A1891EE20A1413C358EC93C8D0D34E90C424BCA367AB4B7C63FDFA0931FB8735ECC5FE22694F8E2784389AC68974BBF1FB5196A5CFA63D30464968927752F1F8F216A07A467EFBCFD4078203DA384AC63A6A304AC56114D2BBDF9212F58BDE3AC556E168ACBF0AB63370D44E90D63E5CEDACA9D94F248B74A783E3852BE5BFF73E27F6FAE6BD0BE5A7A014262CBFB7ADB6A29477D9F2F5FB45E9AD5F16C07B06CA166455C83377C52BF61D06D8CCA11B692F7F05E96264C52295C73D6CD991190A54A2B097BFDBBA8B89A5DFCD1FF9DAFD24542B78FF5F00AF78890EA8297223CCAD28DEE98D829750A17298ABE7F3ED70E7370B1CDE1B4F23C24D69F0F4EA9F821B89BAA2D4577A247118EEF70F780FEF57DB587E1F3EAE54748615BE921CA766FC7EC2961E36EFB41CFC607B989ED0C4254057FD9D39715A35C872ED17407856C80C35F65BD181B181942CB5D62710FE60D0347FEEC2AC3ACE45EA72FCB4256EC07C0383B6CF930CF56CDB9803CEE74A66F83ABEF9C75A0D222BF02C3535B6E3C0DC3124A0E603B9E6A89A3BF636305D2174A2B379C4E36685993C8E8B4E44905D2D352B9EE9101910DCB6931C904D16CB0A079B6669DA3FF8F925A3119EF27F4164DA23405F8F135E454D09BEA876E27449E5884884A24833F3BE93165240285E43A3E4B296CAB04891F574787335DDF17085F77B37AFCD8221AB748FCB28CA2C664931C397E2CD70F8EC8D21C467A16A1F33EB1A5E9C0CA80EC81697A40FE6B01753AC39216301D9763D401DE1460DEC6BC546FDB648C79F9A7B80D6A8CD2AC8E09970D52B1FD4D780A51DBDDC4FDCB53A3D6DB50C6959C78AE8E1912BBD9B259159BEFE965834EB8F17F00A10DE857A49A6E94BA5E930998F283CB035C83174B17596B4C3ECFAC1912AB9799A92E2A01D6A0004753E3D2E5F8748A697D4007DF99C32C3E6C1C3DDDDEF90B9539D716DCF3F95CFC4CA0A9D9AD13E570C55A708986D1304740AAE543C4506D96DB45AC0547854735EFAB7814C8FF5029B256DA0C58E6BC618008117E92228B618103642E8AE533D5859178AB2B39E3B0D044195F531E8304DCA4B883E1B2DFDA12663E9D5FE976935CCC1594C6284A68C4CECAAF842F5927CEA53 -20210529031713 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CA36AA3B7 -20210529041139 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CA75D422B -20210529050432 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CAB1C588B -20210529050545 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CAB28E9FF -20210529063055 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CB131E3CF -20210529074241 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CB6403B37 -20210529084711 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CBAB7BD1B -20210529091139 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CBC6896B3 -20210529091418 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CBC8EBF67 -20210529104434 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CC2D31FCB -20210529114106 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CC6BA9507 -20210529124457 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CCB1266F7 -20210529130632 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CCC8BF0A7 -20210529154413 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CD7337777 -20210529171849 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CDD794B1B -20210529201318 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CE8F228D7 -20210529210612 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CEC4AD6BB -20210529211901 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CED1A6127 -20210529213817 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CEE51861B -20210529215309 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CEF3757F3 -20210529215904 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CEF8E8187 -20210530010351 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CFB5346BB -20210530015721 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CFE9B3287 -20210530020811 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2CFF416103 -20210530062143 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2D0EB89917 -20210530071701 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2D1208E667 -20210530095307 2 6 100 8191 2 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2D1B675F3B -20210530111421 2 6 100 8191 5 D8A2E2F024645B5A3FB339A2EF06A3E46CD2AA808530C320F121CE1EEBEE128D6DB4C49492881B35E5AA8C43CAA07E7F69A5C4ECD0EE62A29FC191B9C0DD6955E23E831A0573135B9931D03A5BBCA961410CA287D08D53C0E8CFEC19534C4FECBAD0F2BE625802AF1B504F59A4A88DAA5F52F221E0E9E0DB1396F07EAF2CA88B79D8CF35EF154A69569C545CA1D04A07ADE3628243039985880B79972FB9F5070951D40C9D21C1729348152724531B270C9DEBB5B2C730C72F4EA3932DB44BD3C746E082856A4109A37BA979164881D5B8007807FF1A7E0C48F99DBBE1709585203E579AE201D295E720CDD45B3A8652A7CE878765E699727641410F840871B4362DC51A3D4D15980876649089CE845B5733497FB8E7B2568EF8627EC1BEE0434A3A72094132A0BA0CA102A440952285823FB09684A1C52468193F6E8A6CC9D935C13FCC661DED5CB84B5D5DF721447531787F78AB31AA1D6342460A8B896518640B7DCF3825B52D46469351EF17E586B661D5C0E792C0AA0B0309B8A4BECB3B267BB459C7452387FF6028EEC1C6DFAE3EE9452EB7A7CFB9CDD361B45FF29E6648BD94712BEF29A1C86C492231F710BC66BF8CF83F8765EF6DBA6857C733789DD71245F17C6FA03DD07FCFFBC450029776FDB4F4B411D4B4A98E090CB79B4CF990398FE1C147CE959C8C11D5DE9A4271EA4CA3D8A50A6F7081A2B0F95AA4AD80081511C357D9F15B7547F0A725EED4EE7FDDAE32A3D00512984928679C51375777E968FE3363DCC495300762C7C6D32F4088DB4D4D4449610D05E87CECADA742827EF2B4EF1D064CEB0EEBB01264306F3E24D6260483829576F88B8346764429722BFD0FE3845F541837ACFFEDA101E0E082F618630B741BE1A9E44C677A947FEC31F08EB338798617A09C38EF3FF31A677E62DCDBA2C56D37B1F16AD2B06F41D3E5CDE9A9B7179B6EC46DF99D857521DF29E8012A1AFE6F2F0658171F56EEA20E531C3B2E02864B130BB0BA476F23024DCCA6411CE1BBD1D5C9F5346DB36334117AAF7A1B4ABE86470CABDF862010F5AE3129CA17F36BA89EE3DB83641804EC2455ED75686342E9F339068A77258BBC292E05AF5C233F5B74CA83080CC5DAE01E977E2F7D1ADC36803398B81DAC22DE391F512912148392371C658C416C96C8C3035928EDBB418CF249C9C02793AE6661AB04B4C6C944F55B23CB5621511DACD8EC5C1ECD463620CAC79C38B6CC95FA8993482EA255246D30DA6EA67C677889F56CDF4466F5D968069E152B0BE30B64E1B18607035D7D15503D364B73BAB5582CDF290FE30D2EB7A4F6F797D80702CC448E1153A3A9D882445C73BA490388588F31FA6C14BA7DBFAD39E1CE6B0E2FAD69015F81FF6DAAC56420A478CF717DD952A0DC51B1E38113CF5EF2AC2EC08B6F6CB427A06AD990213C09DB2D2044A90F +20220414072358 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5D1B922F +20220414072402 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5D3FAAB3 +20220414072411 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5DA6E2EF +20220414072429 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5E5C2677 +20220414072430 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5E5C4C6F +20220414072435 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5E8EADAB +20220414072436 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5E9B7C6F +20220414072440 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5EBA84AB +20220414072442 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5ECDB22B +20220414072457 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB5F71BAC3 +20220414072517 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6044356F +20220414072521 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB60678097 +20220414072523 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB607297CF +20220414072528 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB60A2A627 +20220414072529 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB60AAC38F +20220414072533 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB60CD7B87 +20220414072538 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB60F9FD4B +20220414072540 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6103C8C7 +20220414072545 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB612FA3CF +20220414072547 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6139A9BF +20220414072548 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB613E9CC7 +20220414072553 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6171EBF3 +20220414072601 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB61BAEA33 +20220414072603 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB61CF5307 +20220414072606 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB61E8149F +20220414072607 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB61EB7577 +20220414072607 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB61ED0BA3 +20220414072611 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB620FE4E3 +20220414072615 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB622D2F63 +20220414072616 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB623847EB +20220414072628 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB62ABB94B +20220414072638 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6312214F +20220414072643 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB633E1C73 +20220414072647 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB63669B3B +20220414072650 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB638220F7 +20220414072653 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6398ADAB +20220414072654 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB639EBE43 +20220414072707 2 6 100 2047 2 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB641D23FB +20220414072710 2 6 100 2047 5 F19C2D09AD49978F8A0C1B84168A4011A26F9CD516815934764A319FDC5975FA514AAF11B747D8CA6B3919532BEFB68FA118079473895674F3770F71FBB742F176883841EB3DE679BEF53C6AFE437A662F228B03C1E34B5A0D3909F608CEAA16C1F8131DE11E67878EFD918A89205E5E4DE323054010CA4711F25D466BB7727A016DD3F9F53BDBCE093055A4F2497ADEFB5A2500F9C5C3B0BCD88C6489F4C1CBC7CFB67BA6EABA0195794E4188CE9060F431041AD52FB9BAC4DF7FA536F585FBE67746CD57BFAD67567E9706C24D95C49BE95B759657C6BB5151E2AEA32F4CD557C40298A5C402101520EE8AAB8DFEED6FFC11AAF8036D6345923CFB6434F4DF +20220414072729 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6436684F +20220414072730 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF643C46A7 +20220414072734 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF64668B47 +20220414072739 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF648F9F5B +20220414072741 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF64973923 +20220414072744 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF64B4BA7B +20220414072749 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF64E993BB +20220414072753 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6515105B +20220414072757 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF65323FDB +20220414072809 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF65A7F357 +20220414072813 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF65CC809F +20220414072817 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF65F46043 +20220414072829 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF666C8F9B +20220414072832 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF668915E3 +20220414072835 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF66A68853 +20220414072848 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF672C226F +20220414072851 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF674E2523 +20220414072854 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67616DDF +20220414072857 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF677613DF +20220414072900 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6792A07B +20220414072903 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67AC314F +20220414072905 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67B61CAB +20220414072907 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67CB88C3 +20220414072908 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67CBC62B +20220414072909 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF67D5028B +20220414072925 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6879A003 +20220414072927 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF68874667 +20220414072929 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF68967B9B +20220414072935 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF68D81493 +20220414072953 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF69A1B363 +20220414072957 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF69C2BBA3 +20220414072959 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF69D13857 +20220414073003 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF69EF96CB +20220414073004 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF69F43F4B +20220414073006 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6A06D42B +20220414073016 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6A6A7103 +20220414073018 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6A7B9AFB +20220414073018 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6A7BD38F +20220414073019 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6A7F4A6F +20220414073036 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6B2FC84F +20220414073041 2 6 100 2047 2 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6B67F26B +20220414073055 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6C025837 +20220414073058 2 6 100 2047 5 E28FC4E08A6D57BC5842065F7028D34B56B517A920144E422159168C0CF6F65E1C9CB385AD0BAFFDA8A78C13A1D32CDC4C0E695426E46F524468E9FF7E423C61B626710F9F3BB9F67F058AC00FFD91AFF9061C88EC8D698F974AA4D7070633D1B7982FA906ED686783E607438859AF0E23BA99392DE67A01D4E2CB47E005EFF3C0DEE0AFFA72D80AD54803FA4C341F6B1B8680C6EB9E3B4A93931485B1F0E92ADA1F3D3F049430454E0C51492C5502BE844CF7AFABC9B6ED351B59098B457C17BBDF6E90B63EBA42E0F03818AB4250668C0F55C0DD8F64D5EE5BFB47713E7935129A97C5B3F917972D7F75263D20B9664DEC37045C7659039593F3AF6C19C927 +20220414073921 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB839BF99CF +20220414074048 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83B22A8CB +20220414074055 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83B38DF4B +20220414074204 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83C4E96FB +20220414074223 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83C952457 +20220414074458 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83EF76EDB +20220414074505 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83F0B3E5B +20220414074508 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB83F1192F7 +20220414074657 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB840C320E3 +20220414074757 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB841ACDB2F +20220414074809 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB841D33923 +20220414074813 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB841DCED47 +20220414074823 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB842009833 +20220414074835 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB842257813 +20220414074840 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB8423357CB +20220414074844 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB8423B8E6B +20220414074923 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB842CB64CB +20220414075134 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB844C6295B +20220414075206 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB8453EA8F3 +20220414075228 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB8458F2F8B +20220414075251 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB845E71A57 +20220414075317 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB84648C5EF +20220414075352 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB846C72BBF +20220414075450 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB847A0F4F7 +20220414075521 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB84817FBD3 +20220414075541 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB84866A397 +20220414075556 2 6 100 3071 5 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB8489919F7 +20220414075630 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB84916DB03 +20220414075833 2 6 100 3071 2 C51B2203994018FE66AF950975C59F6B678BD895CBD976250E5513528EF9B03B85B0DD85C17B519B1D41CB11CFCF86F9649C411D746E8ADA9A743D09458BE956D59D6C471945A92E1A6AD2B519D24373242BDD1A13BDE5EAE3518F17F8D2EB158F5340F76212DE07E67816FCC95EABAA1568116D400FC2EE789EB0C097AC9E94DB7B6A861F35B7F57C58934FD6034B4352F83978CB943D63921D8B29BC30A5CB5069A31F550206767EAB17FF80BD34A849F05CEA09CE2B374D70B25DFC31DD546310C948F9DAF4E0C873FA5AC0221EF1D761F581AE4C8C890FCC7D16E5A82B4DB3C9C713A3A13E8039D62AB2DC9B4AD3B1BB721D985C2DD6333E9871F5E4D76AC163D90CC629CC81783087DBC70739200FB5703FF4BEA4202FBEAD26311123672F1E6CBD0DA429CD253E4F579D5FFECEF1DDA78D2AF6B6D8B9818E334D42DFF3F7ACAFD350421BC6C551C004FBE620D397EB602AD2CEDD0D61C9E22D622AF8197393CFEB7250F6D13CBC5CB7625242B0CD23B174F66B00BEDA0E4CB84AFEC0BB +20220414075927 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA416BC45B7 +20220414075956 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4172ADEAF +20220414080014 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4176C3D1B +20220414080031 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA417A81CB7 +20220414080111 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41846F30B +20220414080114 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4184B28B3 +20220414080215 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4193CE3E7 +20220414080230 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41972BB5B +20220414080234 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4197B2B2B +20220414080256 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA419CEB82F +20220414080413 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41B04B177 +20220414080440 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41B6F0F87 +20220414080455 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41BA8FF03 +20220414080531 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41C38E9AF +20220414080538 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41C4CE0D7 +20220414080549 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41C714107 +20220414080559 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41C93CC8F +20220414080612 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41CC0E6F3 +20220414080632 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41D090397 +20220414080739 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41E0CE6AF +20220414080844 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41F0FD883 +20220414080927 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41FAF88C3 +20220414080944 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA41FED798B +20220414081010 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4204E96A3 +20220414081036 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA420AE22CF +20220414081101 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA42108AABF +20220414081119 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4214499C7 +20220414081154 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA421C7C413 +20220414081217 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4221AEE5F +20220414081236 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA42261B5C3 +20220414081253 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4229C2F0F +20220414081339 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4234DEBD3 +20220414081352 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4237ABDBF +20220414081357 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA42388B4CF +20220414081406 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA423A221F7 +20220414081420 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA423D608D3 +20220414081459 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4246BBC83 +20220414081542 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4250E9783 +20220414081700 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA42630DCAB +20220414081734 2 6 100 3071 5 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA426B23DD7 +20220414081825 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA42776DBCB +20220414081912 2 6 100 3071 2 F5A593C9AFA507A500AC0F2C6389F394E8818163FA32B928AC5A46FBC5556CFC88FC789A9EE0E99C002FC4E3DABCAA2BF268FD7FB49A26E986A300CAEEED3C55E43DD1681074B52C4DB264879CE4B96F2CBB172EBBEE34A7E87CC3818AB3E6AAF135C7CDB655F220B93C32B2CB69F538CCE40AF86994CB6D80D0456B3CAA38C46B0D09C0D26C8E67D4EE6E4FE219AC92FF244216E6DCB4267C0DA00E906730792FA9BDA189B9CE5D552B04F1314418936BF02B08FE3AC2033A6B17DF3956D1316FAA6347FD940DDA68FB8AAE1B42E225B2CB8C81BA82DD05A0284F4C08DA48B991DFC1DD08E8ED02AA3FAF82E34CAC009930DDA85040A5D380F8B9B79F69F46D860319636C5931E1C25EF07F5B3D9964ED066E8E0D1C9E73121907C3A27EDCDDBD231B0BAEB124C13F1EBAC60035DE0017D5B0DABA74763096E26F7C9A7394B73BB65A7733F2A69FA6B0D8543CE3D98C083DE93B48BF974556CE3B0230DE2B13D4BA011DB8272BA6DDAF54E0E26E10180C03397156FFCAE19A95ABA4282A042B +20220414083041 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB23411639DA0F7DB +20220414083420 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB23411639F33C3DB +20220414083538 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB23411639FBF5323 +20220414083742 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A0A39C73 +20220414083748 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A0A515CB +20220414083806 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A0BD1AC3 +20220414083844 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A0FE2EEF +20220414083857 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A10F0FBB +20220414084033 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A1B65ABF +20220414084433 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A3641CDB +20220414084513 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A3A411D3 +20220414084808 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A4E0E273 +20220414085212 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A6A1D0B3 +20220414085536 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163A81A77BF +20220414090236 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163AB233EFB +20220414090316 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163AB65D58B +20220414090426 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163ABE1A11F +20220414090629 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163ACC285FB +20220414091059 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163AEC45C03 +20220414091158 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163AF2CCFF3 +20220414091314 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163AFB69BF7 +20220414091552 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B0D7D40F +20220414091928 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B26330CB +20220414092153 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B3673963 +20220414092830 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B62CC3A7 +20220414092943 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B6A8C34F +20220414093010 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B6D25E3F +20220414093441 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B8C7B5FF +20220414093544 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B934C513 +20220414093731 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163B9EC8F87 +20220414093843 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163BA69E11B +20220414093925 2 6 100 4095 2 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163BAB069A3 +20220414094303 2 6 100 4095 5 F32919EC12E2FE5DCC900B63D26BA6DD1030C9D818431D43D7629C26DF0B797B85C4DE6D39A179EFDBF452D6FAEAFF7D89C80E2BF78133324537D863C67C527C8C8D321CCB69E1B4A97675179F0D581560D1BB4CB5FC0EE1BBE740DC53E81D509A2AB1C502E02196CB7910868E93FE8151C148430654A623949C8C985F169D78CF7143FADEA9363103FABE79F14F966061DAE8202CE667C23877B4375148E3FE6969270D90C0BB11983A725320FE2E110452D56CD29924687638285FF60F528FBCC8F9F21D1AF2C150265F6846BABF083F10B43D92FCC02F5794034DE043ED9EDD2088E590314930FDECCAF3BDE0D07ED9DB167BF2AF1634EF88C77D3016BFC17B0903449E3611BE247665FD4A2A4F1D988C67BA1B81B4C9453ADF5C98EEB584C5FB25F8B0EA3606C80A459DD58B0D10E50FE9A7E062E9E918765B1C5D2BE056F846BC7BBA649F2BCE549B2FA5A55D3F31388C1EFEA4E8F2800A2A050E8468E8DDD4DA986C6496159A26E2CA9CA26415EE53F6403DAB022C1F19EC1B311A39495AF6A82BD1FD9AE47BF5C10B013E7CA7DAB015BDA7B60EFA5FF4916BC6CB81C5B6132AA9EF4E49716D98FB66C349CB956DDE33CAAE1BEA93AC395C84B3F58FCDAEF3F58F9DEF5F7EDB527578D1711A754BFE19718A41CA16FAB7C106194455EEAF4E0D4FA29D2BF224B328F7B546382F2FB4E8EE41C96ECAB2341163BC328B97 +20220414094931 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818DA7CECB7 +20220414095121 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818DB3FEE97 +20220414095821 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818DE590FC3 +20220414100127 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818DFAAB9F3 +20220414100220 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E005F20B +20220414100244 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E029D1B3 +20220414100254 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E034AA33 +20220414100620 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E1B8C073 +20220414100630 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E1C2553B +20220414101142 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E40A1E13 +20220414101258 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E48D9E87 +20220414101626 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E60387F3 +20220414101801 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E6A9F503 +20220414102152 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E84F18E7 +20220414102225 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E886BDBF +20220414102443 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818E97C4BFB +20220414102556 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EA01679F +20220414102609 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EA10FE8F +20220414102639 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EA3F86AB +20220414102917 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EB641A1F +20220414102948 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EB94F7A7 +20220414103222 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818ECA88E23 +20220414103323 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818ED15B99F +20220414103354 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818ED44961B +20220414103407 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818ED54ECC3 +20220414103413 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818ED5700CB +20220414103734 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EEB53ED3 +20220414103800 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EEDDB6FF +20220414104012 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818EFC5E0E3 +20220414104150 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818F0739283 +20220414104329 2 6 100 4095 5 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818F11E163F +20220414105100 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818F451B803 +20220414110021 2 6 100 4095 2 E8B371757422F6F4C734F2E4380126789768169B37154E4E3A4A74A3DF6545653A5970CDE0F0BD17CCFDAABBEE7568E1285D5A704BB9739EAB680D7EF59C134D327B55CF4AD69A4128536E2F055F5FBF0DB661C322A4993E382B997B2A0C5E434678B1910862AE385C415FF811BA11727CFE39C559847E710AC2D4BDA8D658F2259887E78D54179287BFE112E9C532CB1D062419DFF6E031F82EC991523A1144385189A813DFACBC63D8DAD98199696715C6BC5A22A1943B2CFC4BDAD8473FBEB7BCEC204EC12CFDB1A9BB66DCF85B3121C9E1C3587960769115B2F27ACEEC29A1CDC717B7505A561051F0E88A3C51798CD829E234ED14C277E9635B3E05EB13FA36F117B46094CA68F45F3667D6E84E0214F1650BF080CC4CC5510D6569E0226E88CD842B2ACFBD31370B136E5FD22C6697090586F38323AB36FB5569FB0FD53BB4AF10C16F0B809C1FB5B1B1C56027244F5A174A37250721197CE425CB5E5C5A51D4A5EA4A1EBEED71511BBE0BFF03CB1AE76968166167A775AB1AD9C9665C6ACC04203E5B2E80AA9F7CF395C28EC432A36A97CDBB354E20BEA600F383D7729DE8B9DF5B16B721BEE8C6ADF51DA8EF5B7B3367EC8E6788F9772835586D09A9F8423AF1221CA87CBD54EC399E0BE49AEF19C017EEF36B3B18517DB2246EABBB21F6DF5CA2F4E1D178D0F42384CA192AA1461452BBC453FB59C54818F852CDBB +20220414112534 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B97D57323 +20220414112820 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B9836476F +20220414112915 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B98509153 +20220414113222 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B98BB7CAB +20220414113851 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B99A6C927 +20220414115900 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B9C9A8187 +20220414121305 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31B9EAC674B +20220414124550 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BA38974A7 +20220414124932 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BA40E655B +20220414131030 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BA71F8DAF +20220414131803 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BA82FCF2F +20220414133154 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BAA30669B +20220414133700 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BAAE42927 +20220414133729 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BAAECA503 +20220414135933 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BAE1D12A7 +20220414140132 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BAE5AE7DF +20220414141651 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB08CFCFF +20220414141714 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB091AD83 +20220414142320 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB168D7F3 +20220414143527 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB322E33B +20220414144127 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB3F516CB +20220414145100 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB545E7CF +20220414145934 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB676BF17 +20220414150941 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB7E51E57 +20220414151158 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB831F3E3 +20220414151904 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BB92D7ACF +20220414154448 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BBCD2236F +20220414154556 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BBCF2D2B7 +20220414162116 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC1F88833 +20220414165146 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC6458233 +20220414165524 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC6C0DCC3 +20220414170020 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC7669C1B +20220414170406 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC7E116A7 +20220414170516 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC802E3C7 +20220414171447 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC946FB1F +20220414171849 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BC9D13AEB +20220414173651 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BCC51B887 +20220414174909 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BCDFE595F +20220414175707 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BCF0D967B +20220414180209 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BCFB6BC33 +20220414180857 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD09DEC93 +20220414183147 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD3C3862B +20220414183832 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD4AAE607 +20220414184336 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD559A367 +20220414184426 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD56C4CAB +20220414185501 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD6D7EA1F +20220414185956 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BD77C34DB +20220414192107 2 6 100 6143 2 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BDA56DD2B +20220414194147 2 6 100 6143 5 C008BA5D87ECC10B5E79F4C05438A7EAFA57C290A50C25A0DFD5FF2FF19F5D39568056AF4AA2FB56F1CEFB636A5E30D99379305FE9633EA9CF219FD87C501640F500E2AFAAF304B7EF862B6C4C8339B558E3B8F00AB714AD6460786AAE3B328D41806A94F270B4D1F13B958579F3C1A7ACB166FB2E5566ED4305AB36C357852B2ED67D4C877338D891E0FFBBDE512E976B754CA2BA1770D8CE7117D5CEB99715C99D97285F3744533CD9BE72A4FBE2CACD4796FA3EFCA27CCA1F7F96DC2A521CCD7776125A5DB2EE4A12B1DCFD797C47188CE5CB6859ACBB452F922F4FF7E2098CB090F83812A18D8DD9B7465B2572EED81332A84C1591F1BA1633B571423FE38BAA819B0AF2C30676B00EBD98D386FED880BB6D9FF4A05C206A8394E973350A597FC337260025BE097EB7409A182C500853B9C90A096708BB83A80F2EEF4EA23190B9CE095C92A1B675903B07149C34E9FFAF6908BCC27D495AFED5C652242B939F71690748895E93181C746CB6E94C2E58C97149F5F3FE3CE552F44AA859115AC5459C3CA343EAC5F98D076E661EE24E15F22FA81393F85E7D1B26FD4D6CC1DC7BFAC0E1C97438141A98D65EFD1592D4A1211DC089CEC0903DD7F333F55FFE70609FACDE7B7293036BAAB67E6DEE7FB82E16019AF642814BFF4AF6676446AE656ACD601812A86B8DB9A53A1EBB744ABDC7C88DBABE4AA023FC253B56B3B517DFE66156BE7DB0653B3DA80ACF010125D652C38DC91BBA2C247AD9F769A9C2F8FA16A0B0507CA632612F9AD03C5E281FFB3341A929E1EE9A946889AF525B348DE24362FABAE20E583D67B4624C96053960F4744BA71C1911D5A84B3615CC8F52E23C10C38E542B61969BD82257B2BE5B50EF63B5110D6D23B81D33176473020D363845C45BD03D2AEF81F2A87C1BADD4C1248A3004AE57562E38B0FB10124E23DFC0AB9257F5982748E39610A46A974459A2F30D852D560D45BAABEC8B8BE77F8AC9AC2424F69FBD9E23F226FD7FCBA827ACCC49E9EEDDF659ACA0E931B965401E416FB6969743B8CDEC4DEC49648D7C1B82B7B337AB496F9C5FD31BDD2AA5D7 +20220414200557 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687646A1E9F +20220414201020 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868765073AC7 +20220414201829 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687663CEA53 +20220414203003 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868767F30C97 +20220414203735 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868769010163 +20220414204108 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687697DB9D3 +20220414204650 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586876A4AA523 +20220414210821 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586876D725353 +20220414211625 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586876E9775FB +20220414212842 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586877066A0AB +20220414220717 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868776159A7B +20220414232618 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586878185133F +20220414233421 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868782A4E2C7 +20220414234330 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868783E43363 +20220415002146 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868789570393 +20220415004554 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586878CBF2353 +20220415005307 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586878DBC5B9B +20220415011041 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868790357083 +20220415011858 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687915FF2DB +20220415011944 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586879171F173 +20220415015846 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868796EBC7E7 +20220415020913 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586879851976B +20220415021312 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE44085868798D86EA3 +20220415023006 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586879B22E39F +20220415030146 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE4408586879F87F92F +20220415031549 2 6 100 6143 2 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687A169CCAB +20220415040641 2 6 100 6143 5 ECFEBE907ED5229E0F2A017AAC2F662065526E4CD6767D11B9BC47C5C4D0E39E232885C9039387645B0C61FC91A5B5F97A3A3264DC42DD48A30C3E923D467D8CDDD98F0DE77067BFB45F466CA03EC5B86BF836D9C6298948D315FF4627FE23F62CE3E722A3B60F7D9D6F97D4B10E30924ABF0E094D5155F57DFBD93B17A3E958816225D458E063A4785F4D04A131D6C3AEFF9B405648DC2E0A64F061AB428E6C3B69C65266514A729829756E016CF55D1A917D9CE64ECEA6EB081A85F177BDEED9062CA130A23BB3D90817644F84890C55BB158DA2C0F590826B7073E933EC081268331D56BFB282D4DA250EC39EF3E477BAC8E5B64B712F4457C5B116D0D491AC7AF0E68F3337A51AADA71152604FF386C9CCB4F67204F6A2FBDBE18E5AF591DDA0B5A93382BC210A549262C0A250EF2CB3D3009C4EA412324E359DBEFF97ADA37287D08C11ED12B170B06B8055BC5B17B3F464BFDE141A145A6393750FE9D5EF33C33A43B575091076A24A9E67C56C7B41F023C42166C89E57D001E9161E924A693FD3712355AD60EAC3BD8AC16BA15F5BEABEE3D014B7F5361D7EB36B3F594E1BB98F6813A2D88FD6FC9F008713334AE962B0CB4C07FDB32D549C0F24D127486707C29A7F5EC7F8601961D2E4C189BA3129E48D0D2215E70D9115AAD993E78565715E50EA0E336EA456D469A23368CFB3F0ED6B8AC77738B2A2AC0A7F155CF6D402687212585A2DD9EEAAF614387C7C8D3089D3F42DBD1A594233ABB618AAD84D52F8A234281F2B0F62E3FE23B1E7F28DD89F6F79572506F9B02021CE44914237C190C82F1E5CB395844550EF279E9B50FA1D5B7AE84FE9F31538546244BD4C86FDADB5974396692A7BBE7AD493834DD13418929F8EA0F44BBF8E3D9DFCEF170DF138351932FA05468DE9A922953DF5AB791406E89F752A378A0D98A957773EC3B952DAE04200C1944F30B43D80450F8F83AC4F688D806DE9C9C406D30FC0D9098BE612EF0C4AD2E80B2C746944C727A1015538A53C69280EE0F00D6601CAA6CB0EAF4D3DADBF849D4C1F8F1FD7D438619C70364DACE440858687A85F5E8F +20220415055156 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E02A82E93B +20220415055855 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E02B0AF64B +20220415080431 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0357CD26B +20220415104028 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0420DED43 +20220415110553 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0440C48AB +20220415113849 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0469931F3 +20220415122158 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E04A10FEC3 +20220415125947 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E04CFE8C63 +20220415130450 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E04D5A7257 +20220415133311 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E04F929113 +20220415135605 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E05156D2E7 +20220415142115 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0534A50FB +20220415151250 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E057418E9B +20220415162045 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E05C89A9FF +20220415171606 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E060CD4F4B +20220415180941 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E064E85D4B +20220415194613 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E06C3089C3 +20220415202412 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E06F041BA3 +20220415204136 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0704DA05B +20220415205914 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E07193837F +20220415225928 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E07A9B3103 +20220416005936 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E083760473 +20220416011857 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E084DB18EF +20220416014012 2 6 100 7679 5 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0865D0237 +20220416040204 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E090AFB413 +20220416043614 2 6 100 7679 2 D73E4A149D00067AF38F615C7920E3E58F83FDF73F493F4712369137702E94062D5E0857DA1D94CE7C7660F89D285B5DF0F8FC8A8CD2FF69819BED74B0F05EAA467BA2CB1337A7F6E9EE06670C393AD6C845C1743F511BEE7ED9D65AA1BF3FD41BD6F0EF131358CCEE448D0EFEE47EF75D3F4AA2FE7A70210CE62E2C6F791BCBB4852CDF41C5EF6B481ABB954A6AB79AB82ABC543C6CF66F971F590ECA63988A886308218202016278C80C8F7142E1CC482FCFC313123AAD101AF837EB8A210CE3522F0554FE4A00C29E51510678F9DAB40C21A644BC9237D982C24AD1788C3D20F6520144B491C77DB1C53CE98726DCF09DBD1978573CF32848096B44A72CEF3221D98C44BB32A524549A20D822F5531D7E7875B1B564ABDE9EE100A90A8E51B37EAEAE3E89E3E8348F3BC9D8FD284E0FA829406C5D8CE0826CB3EAD353B6052B9C7FC1CD4967090AFE5F2BC11B3280C93278A1396AFC640AD8AFE9101965306601723E689714C3190C41C4D4635F1541241F452C981A5F574DCE109014A274CDBA4CE6AD7C693AA7D3F18418AA4F1487E657858DF460D53BD835685581BB461310DAF203B67C23E0C17ADCD024033C40EEF27957151D01971F43254C6C4E3D86F6ACADB8BCDDCB300A21FEAA54E59A547C9C06ABA312A5B4736356230580FBCACD3FB08626BD622934B81B8697291C6DCB1124F7A6762DB30B9CFA22A92FEC007E7EDBB188F34755C350A884DE8890D0E5D6F491D9C23D951DEBADCB26E1D25D971F5FD23FFA0BCAA84646352DCA69C7A3BB991961E762E96C48E58A2F8FA52DE7CD9FE7C529289A73E13032154349ECA5CCCB3D5B89980B29872AC5B03EBAA726CFD9790AF85E371F0A5B0588E4874EA300C5A370ED42A97C6E372D1DB9825EA995C0B5FABFEC09A632010EE138E8E35794640D65CA647ECDDC20A4D453CA4C35EE78350A8045B3CAD6CF41D3DF5260E355EB03E819C0068C91C2F530F7C74F680386947FE3FD00C91C5CEB7D0AF97DDC251DE856355D16F7CE88E69B20BB20BDB3204C63EC00277B7D5DC9A77682DE0750EBFF7313289998DE1C6E940F0B172A173531140FDA7A3422FB739F8F1647907355B26C37A47EC420791F68C61CC7A55CA855DE158B43D0DB363153AB9F0DEEC632AE784F62775862C4319971738352448A4D653C1CD7380247C05D56198D19720CB284E6CBF137616D8DB5510FBE81A7F646E5356C998B56125895D10ECAE67FD4CCD73FA78ACAA774DB11BBD5314ABDA3DA139107FCD342BA6CBB9BDCBED536411BD50B38F7234511CE74B1362D07BF71DBD033E6F637C45FB0B25871B173BCE2337D963AD41693E0932065A3 +20220416062823 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB80218A9572A3 +20220416092832 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021995B7A27 +20220416094426 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB80219A994F8B +20220416095028 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB80219B0F266B +20220416102802 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB80219E13BF97 +20220416120843 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021A609A13F +20220416133156 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021ACA2E43B +20220416135357 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021AE55C347 +20220416150622 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021B404E4E3 +20220416151128 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021B462EA07 +20220416155217 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021B782687B +20220416155712 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021B7D8961B +20220416165422 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021BC44747B +20220416170631 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021BD2BC4F7 +20220416185708 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021C588EACF +20220416193124 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021C8261C8B +20220416194631 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021C941917B +20220416200225 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021CA6E54B7 +20220416201249 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021CB31B7C3 +20220416204005 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021CD39B303 +20220416214143 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021D1CB213B +20220416222645 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021D51E3AB3 +20220416230352 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021D7D44ED7 +20220416234159 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021DAA0700B +20220417010500 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021E0C9B503 +20220417020435 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021E5207D2B +20220417025157 2 6 100 7679 5 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021E88D137F +20220417032310 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021EACBFA03 +20220417035624 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021ED21FED3 +20220417051440 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021F2C36493 +20220417052159 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021F342D84B +20220417052424 2 6 100 7679 2 CBC85C4D4EBCF255C5C59577D8AA5AD90A69B25B5296F0E56375785F984F7C899F7F9AF6B2C9194B15A6986941981AC7F389B6B4929F2E376CBF404FC982D91B1D5D8742069C5FF04CB06F655261C68FB38232C141DF7E03297340FA6687EF802A2A9B616B998F04BA24B6657E65250B52DF17531834455D250CB3A0E8CDD070B4F89C82F996416365AB47F1028D66207A6BAD8BA74D0E27BB3CE3F234C59C9CD050ED201ED5C816CAA3DF52A43C612C1079BF51304ED475DDDC73A289AFFA650FC7C4C568ACA26474BD48122BC45354B3AB4F070F6B91F64DACB2FB6F3A6B9FC1182A6818184DDBDF76226DEACA74B78CBAAB347134ED242212BE83D5D1BCD7CD70040518875F00402BBD118E941AF4F038674617A6BCA30F22F40CCFBF6138C854020BDFA5D1336B55081EB46965F647EB1EBD9D290056180489B1E7104FBD061B751D0472124624607D2E6867F7079C0531FECF05A79ADEF6F22DD6FFF9431C6A077BAE0384D447F4085CC805165DD8EB9C8C309B2EDD032DF0D4568FC21E428D6049D809567C707829579A066AA7F62C70EC559586A0749109764F5AE32CAC0C2127BB3654141BA6F87F1911671906B60D77BEE322D71515086B4E9BDA8E853DCF1906CFAEB099B0A1BB5EF0A06752A9C89EB506C773DC12FA8DE2DD8FE789624D80406619AE1BB342C7F01F424E4D5908A02731F051996721E2C0CB6703E131F4B5D1768E386783ED41C1C1318F9E19D995CFEEF998D5659D4A9FBEEDE6313B9E4C1665F1E44BF213E66EAE4435DFC2533EB131F235E0075F406028B650E758F38A582705423BB661A095D24E79B6A1D5C6A36989B28FD2ADA228961C1574187F18D419B46545D7FB147358A8409F5CA3ABBFD14EDDE9C0768E84E77F6E61307908F0DD8CD49B9C413EDE4FD13E4D1FB5CFB0075297258D828C20FD01A261F8D5672BFD190FAE191250F533B548B5469879E8B6BDA77D650ADB83AE9FAEC37FBE8A9F5F85CF47159EBC54A9129692A2B253C735E2F629D183A2ED4F2747BCF143D6D673F0F3703D0122BEDC5255F003311A81FA236D0E93D6CCC3375C4C35474427756E58A245A8F0AD68F1226BDA8ABB969A68B0758F1229038CB16711996B27923A0AE7D81384C24763C72B72B6A23A6EED923D0C70A3E47E47BD572A3398F3D651614A47C942A26F785F75A2DE7EE6FC927BE209729BF52943889E8C14708F592036BD3E3E4990659A13D64A755C39BC588B7D03BBE6129A39746304FEF371C760B1986A6FBF4DD588873571984B10FA6624239082E2273F772BC4FB28BC1E57DCCD35511FB1303BA03BE961D3788131E7A106A63BEB8021F366931B +20220417063546 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAA824C207 +20220417073924 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAAC98E38B +20220417084530 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAB1415F77 +20220417090433 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAB29029DB +20220417091538 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAB351952F +20220417105457 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDABA287EEF +20220417121015 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDABF594DF3 +20220417131800 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAC3FF4F83 +20220417160405 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDACF38B053 +20220417171411 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAD3CDA357 +20220417172520 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAD4899F6B +20220417200514 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDADF12383F +20220417203736 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAE12A45AB +20220417215125 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAE5E926EB +20220417224905 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAE9A3B337 +20220417233642 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAECA4D2E3 +20220418001736 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAEF4202CB +20220418013943 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAF48042DB +20220418030345 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAF9C843DB +20220418035729 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDAFD2E683B +20220418071750 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB09CEE313 +20220418075023 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB0BCCA41F +20220418080602 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB0CC11E8B +20220418082746 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB0E073263 +20220418083338 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB0E5A8D33 +20220418100322 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB13D22C2F +20220418122110 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB1C284B33 +20220418125647 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB1E510FB3 +20220418130116 2 6 100 8191 5 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB1E90B78F +20220418132740 2 6 100 8191 2 C52C5842553651D384813D75CCBD7B83BD255568A4C68FF4D52E1E7FF21591F027FCB743BE99262A53363C83B0A9C2D2E1C1DAEDCCF76A89344F891B001F588691CBC39D7582E69AB96E1E7A2AD2710D4870E1270A36FB44D7D358B0E7EB06AED2AE31FF68CE0198CF3A59EBAEAD81B1C823C4D88F490C2923C993D1B9E267E50DD8FAD09B83CA87A831B31B96DBF72089B9576FC5AFCA41AED93BBE1D5C627255CD02D6F98D097F8FE1F17B1B743B6E66DF5AC512AA430F04436E06793E7E73A914750833BC69830DEEE6FB57C32C3D7941529B915B1C4B6F37FCEC221A9DA83F050D47EA10DD4546309BB15CDC2A25C287B9A16CB0B2BB663A3D64BB7C26107034804C2C7569ECACBD609EF8A68E19768F86476DAEC2F12E14C325C5498DAD1BBFA5AB8F139E588C3B6BAE947D14283E944443B1DC19896D61730F5EA8A43D5AB9E48EC3861DC3D740FAFC39C408DB1E86F96681D630158C66FE42E187ABFB18304CDCF2718CE7B04F7FC55B78A19A0A43FDDB6CB9077FD680D50989DB1EB674BC03F20A1AEB6F9C546515F6C32C4276E5297A4A3AFBE8E6026C10FEA7F791F9049D0768668AFCCAA2D18878190353C870C6E9D4AC0DABF50BDA3B25EB99528566B9E0FAA44711FA57D1D15B75E00CCA8C1C0E76CDE80607556AAEBC173E0025FF7B05858610B85D868C92789BF1A9736B93E6B4AD7EB23A99F83E69B82BB1BFA26696C68D1066566AD45AA1BFF3C88ADDDF4181E9B9733B2D310B360D7865E4853C72AD5CA7614988B631926C237CBCEF8BFC9F861F9BD8FD92CACF2ABA9A72521CD7AF9465E00CA0F3CCECDBFAF75C148DEC07886536E1CCE9A68620F750657DD7EE912A1B9C7D35ED9AD81984544F7221DB21F2B47FA71BC1B76CFD51D3796F04323FEF98802EE57DE86BF7BC3C27CDAF15F00824CA24C928E0A2E9DE4E66097E382DE41B32769CFE9853EC1EB4B788364E9DE1CEAE0DF13545C9FF6DA8C0DC9289B4BE38A3600912AE233859D59BD1CE3A44C4EAFF6B1548C5D8CF7A63E449702ADBEE391C3BB1FB8A7217D74AFCEED66EC0E7C448B4B0D3FB011D666598F238968B66A3BE5D0D2F7E3D1D8D93736AE5FF605D8E17696F4FD6386FE2DB6BAEE6D142D184F5C088F9FC4DC05C1E7005092A6E7214BA7E5E85A7D9666A10B9AB7C14425FA7A1D82910E4B17E9B7DB09DA89CAE91D89277814A46A6F20E70AB75C45B0BD32227E0F7085C84B8A3864C25FB684DCF5B4512C46E04C7CFE7911C5E256CA017186A33447619E65C1839988874FCF00FCD2BB7FC4960B1107045898573AC4C7A7F0E3C17AE2DD5FBB92479B55517D435B4F582EEBE2CB6B926C424C3F1243F6FDDD33184E4132C08AE4DA1ABF5C5036FC8D3883855251B8589F7147889A37A300E7EAEDEDAD9262B626074F039DAE19BEEFB84320EDB201DF103 +20220418144902 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67858150C3 +20220418152824 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67884BD073 +20220418171630 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD678FEE66DB +20220418182724 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD6794E3AFCB +20220418183435 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67955AEE87 +20220418185712 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD6796E81A27 +20220418201627 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD679C621EC7 +20220418211708 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67A079830B +20220418213706 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67A1C79F63 +20220418222050 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67A4C4F48F +20220418224223 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67A634298F +20220419011431 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67B069D573 +20220419021153 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67B43DEC33 +20220419031338 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67B845003B +20220419040146 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67BB6317DB +20220419060359 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67C35DBBA7 +20220419082948 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67CCD1BF53 +20220419084823 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67CDFBAF53 +20220419091604 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67CFB4406B +20220419103659 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67D4D81393 +20220419110019 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67D653D053 +20220419124806 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67DD1EC41B +20220419133200 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67DFE53A7B +20220419144722 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67E49063CF +20220419152308 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67E6C7E127 +20220419161040 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67E9B7FA1B +20220419172345 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67EE2EB17F +20220419184212 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67F2FFC2FB +20220419184630 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67F3381C0F +20220419193320 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67F608FFDF +20220419193640 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67F634CE4B +20220419204750 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67FA7B8963 +20220419205514 2 6 100 8191 2 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD67FAE5B15B +20220419225936 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD6802713B8F +20220419233957 2 6 100 8191 5 CF0A168167DAB1FDFD5C0376DC6E2C93907F486EF5576F14B83FAD667FCC774D179D9A0CB69771C381E7A3AC0F7561E06C8BFD155A9B527EE6F015BDFF6DAE1556CEB985BAAA83E40720B4D91830DDA2BC4BE8C137AB7EB0107D3E04DB39A092C84AEF71E223A40F18B586FA813ED2EC4453A8C15B3531DC651AAFA6136D5BA894B22FA94E96D6034E9A569F4D3366B323D656B5C480D0FC443BA5597B42071CB28466F084FA31856AEAB54268E7DF559C47D0F53F7584273FD41C9C59C130E9E43B0E5664B1FFAE5D3608EBFCDCA6E257B0AED1E270938A03C7494B16E725389F8106CFA4746BD350EFD6688AF36BA679CF2437E25C0335A4C7E51AD3043938D7D49EAD349D50B153346687EC29B70982760D6280C1B92F58AEFC66BAB600A905A40B720A8E75CC1C1D96557F1988FF927ED6C2C614357242CB03E314B19766B1C7D70575A1607B25C6E90F2412DE7D3F140B3B6CD743FEE66DD2F32B35F34C1C4F1523B03F9E68E873FB7697D0D09D387B8E4BA6FF9EE302A8B6D4BEBA2659E8933B8A411BEE451870CA8F388C96C0D1A59F2BCB29CBD5FFDCA855A7A9720E7BCA71037B417D9D54EFED70FB695EB8E3461262884DADE4C7E2F9ED544D650CB9853F1AEE8C48FD285F8C806823065A238AD70A99C832C815970C33E8326ECC759378A603C77D20248DFAAD6AC718D5F04AF2635061C904159E1EB37873B383C7A244C81F58A22553B1DC1A74AFB44B44A5AEA3B096DEB8B6FEFA7778ACBE1B1EF0331B2667611340085C51D092DD6AC47814A4D68384007F87EA2EF20E005ED221855CCF2B67FF58CAA28E40CD9C44586CB054670C2B0EF0E6B73852B5B475409BDD6A6042345630EB1A675F51A13F7453936B72FDACC671D863DEFE781698B6AE6CE15FB6936A27A9D5EE7442380812B8EB4FB525A518239E138112E6BCA6FEA3FB27B30E28F6D3084D8B5E01F20C7D3FD7EEF3E3EB55F392717BCA9CA76900EBADB7AEA8A26F704C8417708D51374E98D61E0D649BFCC0957FB0636762453C8D1CE08B95FB90BB5EFF6A50210679E167C1E0B67AEDC6E7000C1C4AA5509F8F81D679855BD6CF8FE556FADACE0E45F1C1387DD1A14BBC8A3097DC11C7E40E5A31BCE2188D99008BC3163D04D03ABFB8AA3F17DCFADF8A26F4F275886B1C3DE598068054BB5D8D1B4CB5BCA9E6E822377AA7625490BD4735DDB2B4558D677C1DC2AF39CD9C67242D1C41FF3109FBA72C9C22E362310A905738BF8CEB12697EA0A0885BE11AE0A44DD1FE5F6F863AA8740BAD7300FE1FE72062D3C1669CA796B541637141925DE49515D497F669A695C2735489B58A6E48FF5D6E884D262E5EE95F1EDF49DF55485891DE9B7F5B1E73AD0953C021E4E58D3B7001B702EB6A030E81DC6DB9265290FC224695CAB521CCA0449069CBF358949B03FD6804DDE8AF From 687bbf23572d8bdf25cbbcdf8ac583514e1ba710 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 31 Mar 2022 03:07:33 +0000 Subject: [PATCH 069/287] upstream: regression test for sftp cp command OpenBSD-Regress-ID: c96bea9edde3a384b254785e7f9b2b24a81cdf82 --- regress/sftp-cmds.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/regress/sftp-cmds.sh b/regress/sftp-cmds.sh index 1289c4089..85f0e9767 100644 --- a/regress/sftp-cmds.sh +++ b/regress/sftp-cmds.sh @@ -1,4 +1,4 @@ -# $OpenBSD: sftp-cmds.sh,v 1.14 2013/06/21 02:26:26 djm Exp $ +# $OpenBSD: sftp-cmds.sh,v 1.15 2022/03/31 03:07:33 djm Exp $ # Placed in the Public Domain. # XXX - TODO: @@ -197,6 +197,11 @@ rm -f ${COPY}.2 echo "ln -s ${COPY}.1 ${COPY}.2" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "ln -s failed" test -h ${COPY}.2 || fail "missing file after ln -s" +verbose "$tid: cp" +rm -f ${COPY}.2 +echo "cp ${COPY}.1 ${COPY}.2" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 || fail "cp failed" +cmp ${COPY}.1 ${COPY}.2 || fail "created file is not equal after cp" + verbose "$tid: mkdir" echo "mkdir ${COPY}.dd" | ${SFTP} -D ${SFTPSERVER} >/dev/null 2>&1 \ || fail "mkdir failed" From 5f76286a126721fa005de6edf3d1c7a265555f19 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 20 Apr 2022 05:24:13 +0000 Subject: [PATCH 070/287] upstream: Simplify forward-control test. Since we no longer need to support SSH1 we don't need to run shell commands on the other end of the connection and can use ssh -N instead. This also makes the test less racy. OpenBSD-Regress-ID: 32e94ce272820cc398f30b848b2b0f080d10302c --- regress/forward-control.sh | 34 +++++++++------------------------- 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/regress/forward-control.sh b/regress/forward-control.sh index 02f7667a6..3dcddbc7e 100644 --- a/regress/forward-control.sh +++ b/regress/forward-control.sh @@ -1,4 +1,4 @@ -# $OpenBSD: forward-control.sh,v 1.8 2021/05/07 09:23:40 dtucker Exp $ +# $OpenBSD: forward-control.sh,v 1.9 2022/04/20 05:24:13 dtucker Exp $ # Placed in the Public Domain. tid="sshd control of local and remote forwarding" @@ -6,19 +6,7 @@ tid="sshd control of local and remote forwarding" LFWD_PORT=3320 RFWD_PORT=3321 CTL=$OBJ/ctl-sock -READY=$OBJ/ready - -wait_for_file_to_appear() { - _path=$1 - _n=0 - while test ! -f $_path ; do - test $_n -eq 1 && trace "waiting for $_path to appear" - _n=`expr $_n + 1` - test $_n -ge 20 && return 1 - sleep 1 - done - return 0 -} +WAIT_SECONDS=20 wait_for_process_to_exit() { _pid=$1 @@ -26,7 +14,7 @@ wait_for_process_to_exit() { while kill -0 $_pid 2>/dev/null ; do test $_n -eq 1 && trace "waiting for $_pid to exit" _n=`expr $_n + 1` - test $_n -ge 20 && return 1 + test $_n -ge $WAIT_SECONDS && return 1 sleep 1 done return 0 @@ -36,19 +24,18 @@ wait_for_process_to_exit() { check_lfwd() { _expected=$1 _message=$2 - rm -f $READY ${SSH} -F $OBJ/ssh_proxy \ -L$LFWD_PORT:127.0.0.1:$PORT \ -o ExitOnForwardFailure=yes \ - -n host exec sh -c \'"sleep 60 & echo \$! > $READY ; wait "\' \ - >/dev/null 2>&1 & + -n -N host >/dev/null 2>&1 & _sshpid=$! - wait_for_file_to_appear $READY || \ + if test $? -ne 0; then fatal "check_lfwd ssh fail: $_message" + fi ${SSH} -F $OBJ/ssh_config -p $LFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - kill $_sshpid `cat $READY` 2>/dev/null + kill $_sshpid 2>/dev/null wait_for_process_to_exit $_sshpid if test "x$_expected" = "xY" -a $_result -ne 0 ; then fail "check_lfwd failed (expecting success): $_message" @@ -65,20 +52,17 @@ check_lfwd() { check_rfwd() { _expected=$1 _message=$2 - rm -f $READY ${SSH} -F $OBJ/ssh_proxy \ -R127.0.0.1:$RFWD_PORT:127.0.0.1:$PORT \ -o ExitOnForwardFailure=yes \ - -n host exec sh -c \'"sleep 60 & echo \$! > $READY ; wait "\' \ - >/dev/null 2>&1 & + -n -N host >/dev/null 2>&1 & _sshpid=$! - wait_for_file_to_appear $READY _result=$? if test $_result -eq 0 ; then ${SSH} -F $OBJ/ssh_config -p $RFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - kill $_sshpid `cat $READY` 2>/dev/null + kill $_sshpid 2>/dev/null wait_for_process_to_exit $_sshpid fi if test "x$_expected" = "xY" -a $_result -ne 0 ; then From d19b21afab5c8e2f3df6bd8aee9766bdad3d8c58 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 20 Apr 2022 13:25:55 +0000 Subject: [PATCH 071/287] upstream: Use ssh -f and ControlPersist .. to start up test forwards and ssh -O stop to shut them down intead of sleep loops. This speeds up the test by an order of magnitude. OpenBSD-Regress-ID: eb3db5f805100919b092a3b2579c611fba3e83e7 --- regress/forward-control.sh | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/regress/forward-control.sh b/regress/forward-control.sh index 3dcddbc7e..24594cc15 100644 --- a/regress/forward-control.sh +++ b/regress/forward-control.sh @@ -1,4 +1,4 @@ -# $OpenBSD: forward-control.sh,v 1.9 2022/04/20 05:24:13 dtucker Exp $ +# $OpenBSD: forward-control.sh,v 1.10 2022/04/20 13:25:55 dtucker Exp $ # Placed in the Public Domain. tid="sshd control of local and remote forwarding" @@ -27,16 +27,14 @@ check_lfwd() { ${SSH} -F $OBJ/ssh_proxy \ -L$LFWD_PORT:127.0.0.1:$PORT \ -o ExitOnForwardFailure=yes \ - -n -N host >/dev/null 2>&1 & - _sshpid=$! - if test $? -ne 0; then - fatal "check_lfwd ssh fail: $_message" - fi + -MS $CTL -o ControlPersist=yes \ + -f host true + ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1 || \ + fatal "check_lfwd ssh fail: $_message" ${SSH} -F $OBJ/ssh_config -p $LFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - kill $_sshpid 2>/dev/null - wait_for_process_to_exit $_sshpid + ${SSH} -F $OBJ/ssh_proxy -S $CTL -O exit host >/dev/null 2>&1 if test "x$_expected" = "xY" -a $_result -ne 0 ; then fail "check_lfwd failed (expecting success): $_message" elif test "x$_expected" = "xN" -a $_result -eq 0 ; then @@ -55,15 +53,15 @@ check_rfwd() { ${SSH} -F $OBJ/ssh_proxy \ -R127.0.0.1:$RFWD_PORT:127.0.0.1:$PORT \ -o ExitOnForwardFailure=yes \ - -n -N host >/dev/null 2>&1 & - _sshpid=$! + -MS $CTL -o ControlPersist=yes \ + -f host true + ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1 _result=$? - if test $_result -eq 0 ; then + if ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1; then ${SSH} -F $OBJ/ssh_config -p $RFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - kill $_sshpid 2>/dev/null - wait_for_process_to_exit $_sshpid + ${SSH} -F $OBJ/ssh_proxy -S $CTL -O exit host >/dev/null 2>&1 fi if test "x$_expected" = "xY" -a $_result -ne 0 ; then fail "check_rfwd failed (expecting success): $_message" From c31404426d212e2964ff9e5e58e1d0fce3d83f27 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Thu, 21 Apr 2022 01:36:46 +0000 Subject: [PATCH 072/287] upstream: It looks like we can't completely avoid waiting for processes to exit so retrieve the pid via controlmaster and use that. OpenBSD-Regress-ID: 8246f00f22b14e49d2ff1744c94897ead33d457b --- regress/forward-control.sh | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/regress/forward-control.sh b/regress/forward-control.sh index 24594cc15..63bbdebe5 100644 --- a/regress/forward-control.sh +++ b/regress/forward-control.sh @@ -1,4 +1,4 @@ -# $OpenBSD: forward-control.sh,v 1.10 2022/04/20 13:25:55 dtucker Exp $ +# $OpenBSD: forward-control.sh,v 1.11 2022/04/21 01:36:46 dtucker Exp $ # Placed in the Public Domain. tid="sshd control of local and remote forwarding" @@ -20,6 +20,14 @@ wait_for_process_to_exit() { return 0 } +mux_cmd() { + ${SSH} -F $OBJ/ssh_proxy -S $CTL -O $1 host 2>&1 +} + +controlmaster_pid() { + mux_cmd check | cut -f2 -d= | cut -f1 -d')' +} + # usage: check_lfwd Y|N message check_lfwd() { _expected=$1 @@ -29,12 +37,13 @@ check_lfwd() { -o ExitOnForwardFailure=yes \ -MS $CTL -o ControlPersist=yes \ -f host true - ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1 || \ - fatal "check_lfwd ssh fail: $_message" + mux_cmd check >/dev/null || fatal "check_lfwd ssh fail: $_message" ${SSH} -F $OBJ/ssh_config -p $LFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - ${SSH} -F $OBJ/ssh_proxy -S $CTL -O exit host >/dev/null 2>&1 + _sshpid=`controlmaster_pid` + mux_cmd exit >/dev/null + wait_for_process_to_exit $_sshpid if test "x$_expected" = "xY" -a $_result -ne 0 ; then fail "check_lfwd failed (expecting success): $_message" elif test "x$_expected" = "xN" -a $_result -eq 0 ; then @@ -55,13 +64,15 @@ check_rfwd() { -o ExitOnForwardFailure=yes \ -MS $CTL -o ControlPersist=yes \ -f host true - ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1 + mux_cmd check >/dev/null _result=$? - if ${SSH} -F $OBJ/ssh_proxy -S $CTL -O check host >/dev/null 2>&1; then + _sshpid=`controlmaster_pid` + if test $_result -eq 0; then ${SSH} -F $OBJ/ssh_config -p $RFWD_PORT \ -oConnectionAttempts=10 host true >/dev/null 2>&1 _result=$? - ${SSH} -F $OBJ/ssh_proxy -S $CTL -O exit host >/dev/null 2>&1 + mux_cmd exit >/dev/null + wait_for_process_to_exit $_sshpid fi if test "x$_expected" = "xY" -a $_result -ne 0 ; then fail "check_rfwd failed (expecting success): $_message" From 4cc05de568e1c3edd7834ff3bd9d8214eb34861b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 23 Apr 2022 20:17:26 +1000 Subject: [PATCH 073/287] Cache timezone data in capsicum sandbox. From emaste at freebsd.org, originally part of FreeBSD commit r339216 / fc3c19a9 with autoconf bits added by me. --- configure.ac | 10 +++++++++- sandbox-capsicum.c | 7 +++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c285ea32b..f25a638ea 100644 --- a/configure.ac +++ b/configure.ac @@ -504,12 +504,20 @@ AC_CHECK_HEADERS([sys/audit.h], [], [], [ ]) # sys/capsicum.h requires sys/types.h -AC_CHECK_HEADERS([sys/capsicum.h], [], [], [ +AC_CHECK_HEADERS([sys/capsicum.h capsicum_helpers.h], [], [], [ #ifdef HAVE_SYS_TYPES_H # include #endif ]) +AC_MSG_CHECKING([for caph_cache_tzdata]) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[ #include ]], + [[caph_cache_tzdata();]])], + [ AC_MSG_RESULT([yes]) ], + [ AC_MSG_RESULT([no]) ] +) + # net/route.h requires sys/socket.h and sys/types.h. # sys/sysctl.h also requires sys/param.h AC_CHECK_HEADERS([net/route.h sys/sysctl.h], [], [], [ diff --git a/sandbox-capsicum.c b/sandbox-capsicum.c index 883be1858..11045251c 100644 --- a/sandbox-capsicum.c +++ b/sandbox-capsicum.c @@ -29,6 +29,9 @@ #include #include #include +#ifdef HAVE_CAPSICUM_HELPERS_H +#include +#endif #include "log.h" #include "monitor.h" @@ -69,6 +72,10 @@ ssh_sandbox_child(struct ssh_sandbox *box) struct rlimit rl_zero; cap_rights_t rights; +#ifdef HAVE_CAPH_CACHE_TZDATA + caph_cache_tzdata(); +#endif + rl_zero.rlim_cur = rl_zero.rlim_max = 0; if (setrlimit(RLIMIT_FSIZE, &rl_zero) == -1) From dcd8dca29bcdb193ff6be35b96fc55e6e30d37d9 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 23 Apr 2022 20:40:28 +1000 Subject: [PATCH 074/287] Include stdlib.h for free() prototype. ... which is used inside the CUSTOM_SYS_AUTH_GET_LASTLOGIN_MSG block. --- sshlogin.c | 1 + 1 file changed, 1 insertion(+) diff --git a/sshlogin.c b/sshlogin.c index 82dd84819..06a7b381a 100644 --- a/sshlogin.c +++ b/sshlogin.c @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include From 3913c935523902482974c4c503bcff20bd850a6a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 25 Apr 2022 17:20:06 +1000 Subject: [PATCH 075/287] Update OpenSSL and LibreSSL versions in tests. --- .github/workflows/c-cpp.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index b778c9804..02985a10c 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -44,9 +44,9 @@ jobs: - { os: ubuntu-latest, configs: libressl-2.8.3 } - { os: ubuntu-latest, configs: libressl-3.0.2 } - { os: ubuntu-latest, configs: libressl-3.2.6 } - - { os: ubuntu-latest, configs: libressl-3.3.4 } - - { os: ubuntu-latest, configs: libressl-3.4.1 } - - { os: ubuntu-latest, configs: libressl-3.5.0 } + - { os: ubuntu-latest, configs: libressl-3.3.6 } + - { os: ubuntu-latest, configs: libressl-3.4.3 } + - { os: ubuntu-latest, configs: libressl-3.5.2 } - { os: ubuntu-latest, configs: openssl-master } - { os: ubuntu-latest, configs: openssl-noec } - { os: ubuntu-latest, configs: openssl-1.0.1 } @@ -55,9 +55,9 @@ jobs: - { os: ubuntu-latest, configs: openssl-1.1.0h } - { os: ubuntu-latest, configs: openssl-1.1.1 } - { os: ubuntu-latest, configs: openssl-1.1.1k } - - { os: ubuntu-latest, configs: openssl-1.1.1m } + - { os: ubuntu-latest, configs: openssl-1.1.1n } - { os: ubuntu-latest, configs: openssl-3.0.0 } - - { os: ubuntu-latest, configs: openssl-3.0.1 } + - { os: ubuntu-latest, configs: openssl-3.0.2 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - { os: ubuntu-18.04, configs: pam } From 7bf2eb958fbb551e7d61e75c176bb3200383285d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 26 Apr 2022 23:30:59 +1000 Subject: [PATCH 076/287] Add debian-riscv64 test target. --- .github/workflows/selfhosted.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 5ee9c0fe3..1309baeca 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -21,6 +21,7 @@ jobs: - alpine - bbone - debian-i386 + - debian-riscv64 - dfly30 - dfly48 - dfly58 From fe9d87a6800a7a33be08f4d5ab662a758055ced2 Mon Sep 17 00:00:00 2001 From: "millert@openbsd.org" Date: Wed, 20 Apr 2022 15:56:49 +0000 Subject: [PATCH 077/287] upstream: Avoid an unnecessary xstrdup in rm_env() when matching patterns. Since match_pattern() doesn't modify its arguments (they are const), there is no need to make an extra copy of the strings in options->send_env. From Martin Vahlensieck OpenBSD-Commit-ID: 2c9db31e3f4d3403b49642c64ee048b2a0a39351 --- readconf.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/readconf.c b/readconf.c index f26fabaa6..55d2b1a38 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.366 2022/02/08 08:59:12 dtucker Exp $ */ +/* $OpenBSD: readconf.c,v 1.367 2022/04/20 15:56:49 millert Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -754,19 +754,15 @@ static void rm_env(Options *options, const char *arg, const char *filename, int linenum) { int i, j, onum_send_env = options->num_send_env; - char *cp; /* Remove an environment variable */ for (i = 0; i < options->num_send_env; ) { - cp = xstrdup(options->send_env[i]); - if (!match_pattern(cp, arg + 1)) { - free(cp); + if (!match_pattern(options->send_env[i], arg + 1)) { i++; continue; } debug3("%s line %d: removing environment %s", - filename, linenum, cp); - free(cp); + filename, linenum, options->send_env[i]); free(options->send_env[i]); options->send_env[i] = NULL; for (j = i; j < options->num_send_env - 1; j++) { From da8dddf8cc1f2516ff894b8183e83a7c5ba3ef80 Mon Sep 17 00:00:00 2001 From: "millert@openbsd.org" Date: Wed, 20 Apr 2022 15:59:18 +0000 Subject: [PATCH 078/287] upstream: Add missing includes of stdlib.h and stdint.h. We need stdlib.h for malloc(3) and stdint.h for SIZE_MAX. Unlike the other xmss files, ssh-xmss.c does not include xmss_commons.h so ssh-xmss.c must include those headers itself. From Martin Vahlensieck OpenBSD-Commit-ID: 70e28a9818cee3da1be2ef6503d4b396dd421e6b --- ssh-xmss.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ssh-xmss.c b/ssh-xmss.c index 7bd3a96a3..41ede2960 100644 --- a/ssh-xmss.c +++ b/ssh-xmss.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-xmss.c,v 1.4 2020/10/19 22:49:23 dtucker Exp $*/ +/* $OpenBSD: ssh-xmss.c,v 1.5 2022/04/20 15:59:18 millert Exp $*/ /* * Copyright (c) 2017 Stefan-Lukas Gazdag. * Copyright (c) 2017 Markus Friedl. @@ -22,8 +22,10 @@ #include #include +#include #include #include +#include #include #include "log.h" From d571314d14b919fbd7c84a61f9bf2065fc0a6841 Mon Sep 17 00:00:00 2001 From: "millert@openbsd.org" Date: Wed, 20 Apr 2022 16:00:25 +0000 Subject: [PATCH 079/287] upstream: Remove unnecessary includes: openssl/hmac.h and openssl/evp.h. From Martin Vahlensieck. OpenBSD-Commit-ID: a6debb5fb0c8a44e43e8d5ca7cc70ad2f3ea31c3 --- xmss_hash.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/xmss_hash.c b/xmss_hash.c index 50a577943..db0e5fa36 100644 --- a/xmss_hash.c +++ b/xmss_hash.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xmss_hash.c,v 1.2 2018/02/26 03:56:44 dtucker Exp $ */ +/* $OpenBSD: xmss_hash.c,v 1.3 2022/04/20 16:00:25 millert Exp $ */ /* hash.c version 20160722 Andreas Hülsing @@ -19,9 +19,6 @@ Public domain. #endif #include #include -#include -#include -#include int core_hash_SHA2(unsigned char *, const unsigned int, const unsigned char *, unsigned int, const unsigned char *, unsigned long long, unsigned int); From 67b7c784769c74fd4d6b147d91e17e1ac1a8a96d Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Tue, 26 Apr 2022 07:41:44 +0000 Subject: [PATCH 080/287] upstream: Check sshauthopt_new() for NULL. bz#3425, from tessgauthier at microsoft.com. ok djm@ OpenBSD-Commit-ID: af0315bc3e44aa406daa7e0ae7c2d719a974483f --- auth.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth.c b/auth.c index 58754c070..5809c0b0d 100644 --- a/auth.c +++ b/auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.c,v 1.154 2022/02/23 11:17:10 djm Exp $ */ +/* $OpenBSD: auth.c,v 1.155 2022/04/26 07:41:44 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -903,7 +903,8 @@ auth_restrict_session(struct ssh *ssh) debug_f("restricting session"); /* A blank sshauthopt defaults to permitting nothing */ - restricted = sshauthopt_new(); + if ((restricted = sshauthopt_new()) == NULL) + fatal_f("sshauthopt_new failed"); restricted->permit_pty_flag = 1; restricted->restricted = 1; From 0979e29356915261d69a9517a1e0aaade7c9fc75 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Wed, 27 Apr 2022 11:08:55 +0000 Subject: [PATCH 081/287] upstream: Add authfd path to debug output. ok markus@ OpenBSD-Commit-ID: f735a17d1a6f2bee63bfc609d76ef8db8c090890 --- authfd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/authfd.c b/authfd.c index 76e48aab7..b633e35ea 100644 --- a/authfd.c +++ b/authfd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfd.c,v 1.129 2021/12/19 22:10:24 djm Exp $ */ +/* $OpenBSD: authfd.c,v 1.130 2022/04/27 11:08:55 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -92,6 +92,7 @@ ssh_get_authentication_socket_path(const char *authsocket, int *fdp) int sock, oerrno; struct sockaddr_un sunaddr; + debug3_f("path '%s'", authsocket); memset(&sunaddr, 0, sizeof(sunaddr)); sunaddr.sun_family = AF_UNIX; strlcpy(sunaddr.sun_path, authsocket, sizeof(sunaddr.sun_path)); From e05522008092ceb86a87bdd4ad7878424315db89 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 28 Apr 2022 02:53:31 +0000 Subject: [PATCH 082/287] upstream: avoid printing hash algorithm twice; from lucas AT sexy.is OpenBSD-Commit-ID: 9d24671e10a84141b7c504396cabad600e47a941 --- krl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/krl.c b/krl.c index 17b88edde..473a9d737 100644 --- a/krl.c +++ b/krl.c @@ -14,7 +14,7 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $OpenBSD: krl.c,v 1.53 2021/06/04 06:19:07 djm Exp $ */ +/* $OpenBSD: krl.c,v 1.54 2022/04/28 02:53:31 djm Exp $ */ #include "includes.h" @@ -1388,7 +1388,7 @@ krl_dump(struct ssh_krl *krl, FILE *f) error("sshkey_fingerprint failed"); continue; } - fprintf(f, "hash: SHA256:%s # %s\n", fp, sshkey_ssh_name(key)); + fprintf(f, "hash: %s # %s\n", fp, sshkey_ssh_name(key)); free(fp); free(key); } From 247082b5013f0d4fcae8f97453f2a2f01bcda811 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 29 Apr 2022 03:13:32 +0000 Subject: [PATCH 083/287] upstream: fix memleak on session-bind path; from Pedro Martelletto, ok dtucker@ OpenBSD-Commit-ID: e85899a26ba402b4c0717b531317e8fc258f0a7e --- ssh-agent.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssh-agent.c b/ssh-agent.c index 03ae2b022..27d0548f2 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.287 2022/01/14 03:43:48 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.288 2022/04/29 03:13:32 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1570,6 +1570,7 @@ process_ext_session_bind(SocketEntry *e) /* success */ r = 0; out: + free(fp); sshkey_free(key); sshbuf_free(sid); sshbuf_free(sig); From 3e26b3a6eebcee27be177207cc0846fb844b7a56 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 29 Apr 2022 03:16:48 +0000 Subject: [PATCH 084/287] upstream: Don't leak SK device. Patch from Pedro Martelletto via github PR#316. ok djm@ OpenBSD-Commit-ID: 17d11327545022e727d95fd08b213171c5a4585d --- sk-usbhid.c | 3 ++- ssh-sk-helper.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 2d36ac337..2d58c7836 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.38 2022/02/07 01:25:12 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.39 2022/04/29 03:16:48 dtucker Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -1393,6 +1393,7 @@ sk_load_resident_keys(const char *pin, struct sk_option **options, freezero(rks[i]->user_id, rks[i]->user_id_len); freezero(rks[i], sizeof(*rks[i])); } + free(device); free(rks); return ret; } diff --git a/ssh-sk-helper.c b/ssh-sk-helper.c index b1d22631f..bd9b410a6 100644 --- a/ssh-sk-helper.c +++ b/ssh-sk-helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-sk-helper.c,v 1.12 2021/10/28 02:54:18 djm Exp $ */ +/* $OpenBSD: ssh-sk-helper.c,v 1.13 2022/04/29 03:16:48 dtucker Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -265,6 +265,7 @@ process_load_resident(struct sshbuf *req) sshsk_free_resident_keys(srks, nsrks); sshbuf_free(kbuf); free(provider); + free(device); if (pin != NULL) freezero(pin, strlen(pin)); return resp; From af59463553b5ad52d3b42c4455ee3c5600158bb7 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 29 Apr 2022 03:24:30 +0000 Subject: [PATCH 085/287] upstream: mention that the helpers are used by ssh(1), ssh-agent(1) and ssh-keygen(1). Previously only ssh(1) was mentioned. From Pedro Martelletto OpenBSD-Commit-ID: 30f880f989d4b329589c1c404315685960a5f153 --- ssh-pkcs11-helper.8 | 23 ++++++++++++++--------- ssh-sk-helper.8 | 23 ++++++++++++++--------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/ssh-pkcs11-helper.8 b/ssh-pkcs11-helper.8 index 6a592b1f3..5edc98507 100644 --- a/ssh-pkcs11-helper.8 +++ b/ssh-pkcs11-helper.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-pkcs11-helper.8,v 1.6 2019/11/30 07:07:59 jmc Exp $ +.\" $OpenBSD: ssh-pkcs11-helper.8,v 1.7 2022/04/29 03:24:30 djm Exp $ .\" .\" Copyright (c) 2010 Markus Friedl. All rights reserved. .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 30 2019 $ +.Dd $Mdocdate: April 29 2022 $ .Dt SSH-PKCS11-HELPER 8 .Os .Sh NAME @@ -26,12 +26,14 @@ .Sh DESCRIPTION .Nm is used by -.Xr ssh-agent 1 +.Xr ssh 1 , +.Xr ssh-agent 1 , +and +.Xr ssh-keygen 1 to access keys provided by a PKCS#11 token. .Pp .Nm -is not intended to be invoked by the user, but from -.Xr ssh-agent 1 . +is not intended to be invoked directly by the user. .Pp A single option is supported: .Bl -tag -width Ds @@ -47,17 +49,20 @@ options increase the verbosity. The maximum is 3. .Pp Note that -.Xr ssh-agent 1 +.Xr ssh 1 , +.Xr ssh-agent 1 , +and +.Xr ssh-keygen 1 will automatically pass the .Fl v flag to .Nm -when it has itself been placed in debug mode. +when they have themselves been placed in debug mode. .El .Sh SEE ALSO .Xr ssh 1 , -.Xr ssh-add 1 , -.Xr ssh-agent 1 +.Xr ssh-agent 1 , +.Xr ssh-keygen 1 .Sh HISTORY .Nm first appeared in diff --git a/ssh-sk-helper.8 b/ssh-sk-helper.8 index 3c53da1ec..e9b2ae12b 100644 --- a/ssh-sk-helper.8 +++ b/ssh-sk-helper.8 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-sk-helper.8,v 1.3 2019/12/21 20:22:34 naddy Exp $ +.\" $OpenBSD: ssh-sk-helper.8,v 1.4 2022/04/29 03:24:30 djm Exp $ .\" .\" Copyright (c) 2010 Markus Friedl. All rights reserved. .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: December 21 2019 $ +.Dd $Mdocdate: April 29 2022 $ .Dt SSH-SK-HELPER 8 .Os .Sh NAME @@ -26,12 +26,14 @@ .Sh DESCRIPTION .Nm is used by -.Xr ssh-agent 1 +.Xr ssh 1 , +.Xr ssh-agent 1 , +and +.Xr ssh-keygen 1 to access keys provided by a FIDO authenticator. .Pp .Nm -is not intended to be invoked by the user, but from -.Xr ssh-agent 1 . +is not intended to be invoked directly by the user. .Pp A single option is supported: .Bl -tag -width Ds @@ -47,17 +49,20 @@ options increase the verbosity. The maximum is 3. .Pp Note that -.Xr ssh-agent 1 +.Xr ssh 1 , +.Xr ssh-agent 1 , +and +.Xr ssh-keygen 1 will automatically pass the .Fl v flag to .Nm -when it has itself been placed in debug mode. +when they have themselves been placed in debug mode. .El .Sh SEE ALSO .Xr ssh 1 , -.Xr ssh-add 1 , -.Xr ssh-agent 1 +.Xr ssh-agent 1 , +.Xr ssh-keygen 1 .Sh HISTORY .Nm first appeared in From 6d0392b9ff4b50a56ac5685d1b9392e2cd432ca3 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 29 Apr 2022 18:22:34 +1000 Subject: [PATCH 086/287] Remove now-empty int32_minmax.inc. --- int32_minmax.inc | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 int32_minmax.inc diff --git a/int32_minmax.inc b/int32_minmax.inc deleted file mode 100644 index e69de29bb..000000000 From 97a6a8b8c1f2da09712d0e72d0ef800e4edd34cd Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 29 Apr 2022 18:27:34 +1000 Subject: [PATCH 087/287] Only run tests when source files change. Also run tests on changes to V_9_0 branch. --- .github/workflows/c-cpp.yml | 4 +++- .github/workflows/selfhosted.yml | 3 ++- .github/workflows/upstream.yml | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 02985a10c..68db999d8 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -2,9 +2,11 @@ name: C/C++ CI on: push: - branches: [ master, ci ] + branches: [ master, ci, V_9_0 ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] pull_request: branches: [ master ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] jobs: ci: diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 1309baeca..2ddf27599 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -2,7 +2,8 @@ name: C/C++ CI self-hosted on: push: - branches: [ master, ci ] + branches: [ master, ci, V_9_0 ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] jobs: selfhosted: diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index b91083c65..ba0ef8272 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -3,6 +3,7 @@ name: Upstream self-hosted on: push: branches: [ master, ci ] + paths: [ '**.c', '**.h' ] jobs: selfhosted: From 4835544d2dd31de6ffc7dba59f92093aea98155b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 30 Apr 2022 10:56:41 +1000 Subject: [PATCH 088/287] Add Mac OS X 12 test target. --- .github/workflows/c-cpp.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 68db999d8..092b91fdf 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: # First we test all OSes in the default configuration. - os: [ubuntu-20.04, ubuntu-18.04, macos-10.15, macos-11.0] + os: [ubuntu-20.04, ubuntu-18.04, macos-10.15, macos-11, macos-12] configs: [default] # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. @@ -71,7 +71,8 @@ jobs: - { os: ubuntu-18.04, configs: kitchensink } - { os: ubuntu-18.04, configs: without-openssl } - { os: macos-10.15, configs: pam } - - { os: macos-11.0, configs: pam } + - { os: macos-11, configs: pam } + - { os: macos-12, configs: pam } runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 From a45615cb172bc827e21ec76750de39dfb30ecc05 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 29 Apr 2022 04:55:07 +0000 Subject: [PATCH 089/287] upstream: be stricter in which characters will be accepted in specifying a mask length; allow only 0-9. From khaleesicodes via GHPR#278; ok dtucker@ OpenBSD-Commit-ID: e267746c047ea86665cdeccef795a8a56082eeb2 --- addr.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addr.c b/addr.c index 1ad10ae0f..abf3e3d97 100644 --- a/addr.c +++ b/addr.c @@ -1,4 +1,4 @@ -/* $OpenBSD: addr.c,v 1.4 2021/10/22 10:51:57 dtucker Exp $ */ +/* $OpenBSD: addr.c,v 1.5 2022/04/29 04:55:07 djm Exp $ */ /* * Copyright (c) 2004-2008 Damien Miller @@ -397,7 +397,7 @@ addr_pton_cidr(const char *p, struct xaddr *n, u_int *l) *mp = '\0'; mp++; masklen = strtoul(mp, &cp, 10); - if (*mp == '\0' || *cp != '\0' || masklen > 128) + if (*mp < '0' || *mp > '9' || *cp != '\0' || masklen > 128) return -1; } From 0bc6b4c8f04e292577bdb44d5dc6b630d3448087 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 1 May 2022 23:20:30 +0000 Subject: [PATCH 090/287] upstream: fix some integer overflows in sieve_large() that show up when trying to generate modp groups > 16k bits. Reported via GHPR#306 by Bertram Felgenhauer, but fixed in a different way. feedback/ok tb@ OpenBSD-Commit-ID: 81cbc6dd3a21c57bd6fadea10e44afe37bca558e --- moduli.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/moduli.c b/moduli.c index 8dd36b1cf..9f660ef26 100644 --- a/moduli.c +++ b/moduli.c @@ -1,4 +1,4 @@ -/* $OpenBSD: moduli.c,v 1.37 2019/11/15 06:00:20 djm Exp $ */ +/* $OpenBSD: moduli.c,v 1.38 2022/05/01 23:20:30 djm Exp $ */ /* * Copyright 1994 Phil Karn * Copyright 1996-1998, 2003 William Allen Simpson @@ -184,20 +184,20 @@ qfileout(FILE * ofile, u_int32_t otype, u_int32_t otests, u_int32_t otries, ** Sieve p's and q's with small factors */ static void -sieve_large(u_int32_t s) +sieve_large(u_int32_t s32) { - u_int32_t r, u; + u_int64_t r, u, s = s32; - debug3("sieve_large %u", s); + debug3("sieve_large %u", s32); largetries++; /* r = largebase mod s */ - r = BN_mod_word(largebase, s); + r = BN_mod_word(largebase, s32); if (r == 0) u = 0; /* s divides into largebase exactly */ else u = s - r; /* largebase+u is first entry divisible by s */ - if (u < largebits * 2) { + if (u < largebits * 2ULL) { /* * The sieve omits p's and q's divisible by 2, so ensure that * largebase+u is odd. Then, step through the sieve in @@ -218,7 +218,7 @@ sieve_large(u_int32_t s) else u = s - r; /* p+u is first entry divisible by s */ - if (u < largebits * 4) { + if (u < largebits * 4ULL) { /* * The sieve omits p's divisible by 4, so ensure that * largebase+u is not. Then, step through the sieve in From 575771bf79bef7127be6aaccddc46031ea15529e Mon Sep 17 00:00:00 2001 From: "jmc@openbsd.org" Date: Mon, 2 May 2022 05:40:37 +0000 Subject: [PATCH 091/287] upstream: remove an obsolete rsa1 format example from an example; from megan batty ok djm OpenBSD-Commit-ID: db2c89879c29bf083df996bd830abfb1e70d62bf --- sshd.8 | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sshd.8 b/sshd.8 index 350b08ad2..2b50514ea 100644 --- a/sshd.8 +++ b/sshd.8 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd.8,v 1.318 2022/03/31 17:27:27 naddy Exp $ -.Dd $Mdocdate: March 31 2022 $ +.\" $OpenBSD: sshd.8,v 1.319 2022/05/02 05:40:37 jmc Exp $ +.Dd $Mdocdate: May 2 2022 $ .Dt SSHD 8 .Os .Sh NAME @@ -812,7 +812,6 @@ names to their hashed representations. An example ssh_known_hosts file: .Bd -literal -offset 3n # Comments allowed at start of line -closenet,...,192.0.2.53 1024 37 159...93 closenet.example.net cvs.example.net,192.0.2.10 ssh-rsa AAAA1234.....= # A hashed hostname |1|JfKTdBh7rNbXkVAQCRp4OQoPfmI=|USECr3SWf1JUPsms5AqfD5QfxkM= ssh-rsa From e5c036d2092c00bef395e9161dc5ce42d4be9565 Mon Sep 17 00:00:00 2001 From: "florian@openbsd.org" Date: Tue, 3 May 2022 07:42:27 +0000 Subject: [PATCH 092/287] upstream: Add FIDO AUTHENTICATOR section and explain a bit how FIDO works. The wording came mostly from the 8.2 OpenSSH release notes, addapted to fit the man page. Then move the -O bits into the new section as is already done for CERTIFICATES and MODULI GENERATION. Finally we can explain the trade-offs of resident keys. While here, consistently refer to the FIDO thingies as "FIDO authenticators", not "FIDO tokens". input & OK jmc, naddy OpenBSD-Commit-ID: dd98748d7644df048f78dcf793b3b63db9ab1d25 --- ssh-keygen.1 | 130 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 52 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index 59b7f23a1..561600dbd 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.220 2022/02/06 00:29:03 jsg Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.221 2022/05/03 07:42:27 florian Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: February 6 2022 $ +.Dd $Mdocdate: May 3 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -396,6 +396,9 @@ Public and private key files will be written to the current directory for each downloaded key. If multiple FIDO authenticators are attached, keys will be downloaded from the first touched authenticator. +See the +.Sx FIDO AUTHENTICATOR +section for more information. .It Fl k Generate a KRL file. In this mode, @@ -487,56 +490,9 @@ listed in the .Sx MODULI GENERATION section may be specified. .Pp -When generating a key that will be hosted on a FIDO authenticator, -this flag may be used to specify key-specific options. -Those supported at present are: -.Bl -tag -width Ds -.It Cm application -Override the default FIDO application/origin string of -.Dq ssh: . -This may be useful when generating host or domain-specific resident keys. -The specified application string must begin with -.Dq ssh: . -.It Cm challenge Ns = Ns Ar path -Specifies a path to a challenge string that will be passed to the -FIDO token during key generation. -The challenge string may be used as part of an out-of-band -protocol for key enrollment -(a random challenge is used by default). -.It Cm device -Explicitly specify a -.Xr fido 4 -device to use, rather than letting the token middleware select one. -.It Cm no-touch-required -Indicate that the generated private key should not require touch -events (user presence) when making signatures. -Note that -.Xr sshd 8 -will refuse such signatures by default, unless overridden via -an authorized_keys option. -.It Cm resident -Indicate that the key should be stored on the FIDO authenticator itself. -Resident keys may be supported on FIDO2 tokens and typically require that -a PIN be set on the token prior to generation. -Resident keys may be loaded off the token using -.Xr ssh-add 1 . -.It Cm user -A username to be associated with a resident key, -overriding the empty default username. -Specifying a username may be useful when generating multiple resident keys -for the same application name. -.It Cm verify-required -Indicate that this private key should require user verification for -each signature. -Not all FIDO tokens support this option. -Currently PIN authentication is the only supported verification method, -but other methods may be supported in the future. -.It Cm write-attestation Ns = Ns Ar path -May be used at key generation time to record the attestation data -returned from FIDO tokens during key generation. -This information is potentially sensitive. -By default, this information is discarded. -.El +When generating FIDO authenticator-backed keys, the options listed in the +.Sx FIDO AUTHENTICATOR +section may be specified. .Pp When performing signature-related options using the .Fl Y @@ -1060,6 +1016,76 @@ public key must be trusted by or .Xr ssh 1 . Refer to those manual pages for details. +.Sh FIDO AUTHENTICATOR +.Nm +is able to to generate FIDO authenticator-backed keys, after which +they may be used much like any other key type supported by OpenSSH, so +long as the hardware authenticator is attached when the keys are used. +FIDO authenticators generally require the user to explicitly authorise +operations by touching or tapping them. +FIDO keys consist of two parts: a key handle part stored in the +private key file on disk, and a per-device private key that is unique +to each FIDO authenticator and that cannot be exported from the +authenticator hardware. +These are combined by the hardware at authentication time to derive +the real key that is used to sign authentication challenges. +Supported key types are +.Cm ecdsa-sk +and +.Cm ed25519-sk . +.Pp +The options that are valid for FIDO keys are: +.Bl -tag -width Ds +.It Cm application +Override the default FIDO application/origin string of +.Dq ssh: . +This may be useful when generating host or domain-specific resident keys. +The specified application string must begin with +.Dq ssh: . +.It Cm challenge Ns = Ns Ar path +Specifies a path to a challenge string that will be passed to the +FIDO authenticator during key generation. +The challenge string may be used as part of an out-of-band +protocol for key enrollment +(a random challenge is used by default). +.It Cm device +Explicitly specify a +.Xr fido 4 +device to use, rather than letting the authenticator middleware select one. +.It Cm no-touch-required +Indicate that the generated private key should not require touch +events (user presence) when making signatures. +Note that +.Xr sshd 8 +will refuse such signatures by default, unless overridden via +an authorized_keys option. +.It Cm resident +Indicate that the key handle should be stored on the FIDO +authenticator itself. +This makes it easier to use the authenticator on multiple computers. +Resident keys may be supported on FIDO2 authenticators and typically +require that a PIN be set on the authenticator prior to generation. +Resident keys may be loaded off the authenticator using +.Xr ssh-add 1 . +Storing both parts of a key on a FIDO authenticator increases the likelihood +of an attacker being able to use a stolen authenticator device. +.It Cm user +A username to be associated with a resident key, +overriding the empty default username. +Specifying a username may be useful when generating multiple resident keys +for the same application name. +.It Cm verify-required +Indicate that this private key should require user verification for +each signature. +Not all FIDO authenticators support this option. +Currently PIN authentication is the only supported verification method, +but other methods may be supported in the future. +.It Cm write-attestation Ns = Ns Ar path +May be used at key generation time to record the attestation data +returned from FIDO authenticators during key generation. +This information is potentially sensitive. +By default, this information is discarded. +.El .Sh KEY REVOCATION LISTS .Nm is able to manage OpenSSH format Key Revocation Lists (KRLs). From f4e67c0ad259b4cf10177277a5827fa5545bac53 Mon Sep 17 00:00:00 2001 From: "markus@openbsd.org" Date: Wed, 4 May 2022 07:31:22 +0000 Subject: [PATCH 093/287] upstream: make sure stdout is non-blocking; ok djm@ OpenBSD-Commit-ID: 64940fffbd1b882eda2d7c8c7a43c79368309c0d --- channels.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/channels.c b/channels.c index 12f765997..8a8a2c7eb 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.417 2022/04/20 04:19:11 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.418 2022/05/04 07:31:22 markus Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -304,6 +304,8 @@ static void channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd, int extusage, int nonblock, int is_tty) { + int val; + if (rfd != -1) fcntl(rfd, F_SETFD, FD_CLOEXEC); if (wfd != -1 && wfd != rfd) @@ -333,15 +335,18 @@ channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd, * restore their blocking state on exit to avoid interfering * with other programs that follow. */ - if (rfd != -1 && !isatty(rfd) && fcntl(rfd, F_GETFL) == 0) { + if (rfd != -1 && !isatty(rfd) && + (val = fcntl(rfd, F_GETFL)) != -1 && !(val & O_NONBLOCK)) { c->restore_block |= CHANNEL_RESTORE_RFD; set_nonblock(rfd); } - if (wfd != -1 && !isatty(wfd) && fcntl(wfd, F_GETFL) == 0) { + if (wfd != -1 && !isatty(wfd) && + (val = fcntl(wfd, F_GETFL)) != -1 && !(val & O_NONBLOCK)) { c->restore_block |= CHANNEL_RESTORE_WFD; set_nonblock(wfd); } - if (efd != -1 && !isatty(efd) && fcntl(efd, F_GETFL) == 0) { + if (efd != -1 && !isatty(efd) && + (val = fcntl(efd, F_GETFL)) != -1 && !(val & O_NONBLOCK)) { c->restore_block |= CHANNEL_RESTORE_EFD; set_nonblock(efd); } From 37b62fd5caf19c85a48241535277cefff65adace Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 5 May 2022 00:55:11 +0000 Subject: [PATCH 094/287] upstream: mux.c: mark argument as const; from Martin Vahlensieck OpenBSD-Commit-ID: 69a1a93a55986c7c2ad9f733c093b46a47184341 --- mux.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mux.c b/mux.c index 176f035c8..924fbead0 100644 --- a/mux.c +++ b/mux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mux.c,v 1.92 2022/01/11 01:26:47 djm Exp $ */ +/* $OpenBSD: mux.c,v 1.93 2022/05/05 00:55:11 djm Exp $ */ /* * Copyright (c) 2002-2008 Damien Miller * @@ -240,7 +240,7 @@ mux_master_control_cleanup_cb(struct ssh *ssh, int cid, void *unused) /* Check mux client environment variables before passing them to mux master. */ static int -env_permitted(char *env) +env_permitted(const char *env) { int i, ret; char name[1024], *cp; From 0e44db4d9cb313e68a59a44d27884af66c02356e Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 5 May 2022 00:56:58 +0000 Subject: [PATCH 095/287] upstream: channel_new no longer frees remote_name. So update the comment accordingly. As remote_name is not modified, it can be const as well. From Martin Vahlensieck OpenBSD-Commit-ID: e4e10dc8dc9f40c166ea5a8e991942bedc75a76a --- channels.c | 8 ++++---- channels.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/channels.c b/channels.c index 8a8a2c7eb..3ac51bac2 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.418 2022/05/04 07:31:22 markus Exp $ */ +/* $OpenBSD: channels.c,v 1.419 2022/05/05 00:56:58 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -361,12 +361,12 @@ channel_register_fds(struct ssh *ssh, Channel *c, int rfd, int wfd, int efd, } /* - * Allocate a new channel object and set its type and socket. This will cause - * remote_name to be freed. + * Allocate a new channel object and set its type and socket. */ Channel * channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd, - u_int window, u_int maxpack, int extusage, char *remote_name, int nonblock) + u_int window, u_int maxpack, int extusage, const char *remote_name, + int nonblock) { struct ssh_channels *sc = ssh->chanctxt; u_int i, found; diff --git a/channels.h b/channels.h index dfb82f8ce..828c1b61b 100644 --- a/channels.h +++ b/channels.h @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.142 2022/03/30 21:10:25 djm Exp $ */ +/* $OpenBSD: channels.h,v 1.143 2022/05/05 00:56:58 djm Exp $ */ /* * Author: Tatu Ylonen @@ -275,7 +275,7 @@ Channel *channel_by_id(struct ssh *, int); Channel *channel_by_remote_id(struct ssh *, u_int); Channel *channel_lookup(struct ssh *, int); Channel *channel_new(struct ssh *, char *, int, int, int, int, - u_int, u_int, int, char *, int); + u_int, u_int, int, const char *, int); void channel_set_fds(struct ssh *, int, int, int, int, int, int, int, u_int); void channel_free(struct ssh *, Channel *); From 457dce2cfef6a48f5442591cd8b21c7e8cba13f8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 5 May 2022 01:04:14 +0000 Subject: [PATCH 096/287] upstream: sshkey_unshield_private() contains a exact duplicate of the code in private2_check_padding(). Pull private2_check_padding() up so the code can be reused. From Martin Vahlensieck, ok deraadt@ OpenBSD-Commit-ID: 876884c3f0e62e8fd8d1594bab06900f971c9c85 --- sshkey.c | 72 +++++++++++++++++++++++++------------------------------- 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/sshkey.c b/sshkey.c index f1e92003b..ed2b5dff6 100644 --- a/sshkey.c +++ b/sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.120 2022/01/06 22:05:42 djm Exp $ */ +/* $OpenBSD: sshkey.c,v 1.121 2022/05/05 01:04:14 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -2125,14 +2125,38 @@ sshkey_shield_private(struct sshkey *k) return r; } +/* Check deterministic padding after private key */ +static int +private2_check_padding(struct sshbuf *decrypted) +{ + u_char pad; + size_t i; + int r; + + i = 0; + while (sshbuf_len(decrypted)) { + if ((r = sshbuf_get_u8(decrypted, &pad)) != 0) + goto out; + if (pad != (++i & 0xff)) { + r = SSH_ERR_INVALID_FORMAT; + goto out; + } + } + /* success */ + r = 0; + out: + explicit_bzero(&pad, sizeof(pad)); + explicit_bzero(&i, sizeof(i)); + return r; +} + int sshkey_unshield_private(struct sshkey *k) { struct sshbuf *prvbuf = NULL; - u_char pad, *cp, keyiv[SSH_DIGEST_MAX_LENGTH]; + u_char *cp, keyiv[SSH_DIGEST_MAX_LENGTH]; struct sshcipher_ctx *cctx = NULL; const struct sshcipher *cipher; - size_t i; struct sshkey *kswap = NULL, tmp; int r = SSH_ERR_INTERNAL_ERROR; @@ -2194,16 +2218,9 @@ sshkey_unshield_private(struct sshkey *k) /* Parse private key */ if ((r = sshkey_private_deserialize(prvbuf, &kswap)) != 0) goto out; - /* Check deterministic padding */ - i = 0; - while (sshbuf_len(prvbuf)) { - if ((r = sshbuf_get_u8(prvbuf, &pad)) != 0) - goto out; - if (pad != (++i & 0xff)) { - r = SSH_ERR_INVALID_FORMAT; - goto out; - } - } + + if ((r = private2_check_padding(prvbuf)) != 0) + goto out; /* Swap the parsed key back into place */ tmp = *kswap; @@ -4028,9 +4045,9 @@ sshkey_private_to_blob2(struct sshkey *prv, struct sshbuf *blob, explicit_bzero(salt, sizeof(salt)); if (key != NULL) freezero(key, keylen + ivlen); - if (pubkeyblob != NULL) + if (pubkeyblob != NULL) freezero(pubkeyblob, pubkeylen); - if (b64 != NULL) + if (b64 != NULL) freezero(b64, strlen(b64)); return r; } @@ -4257,31 +4274,6 @@ private2_decrypt(struct sshbuf *decoded, const char *passphrase, return r; } -/* Check deterministic padding after private key */ -static int -private2_check_padding(struct sshbuf *decrypted) -{ - u_char pad; - size_t i; - int r = SSH_ERR_INTERNAL_ERROR; - - i = 0; - while (sshbuf_len(decrypted)) { - if ((r = sshbuf_get_u8(decrypted, &pad)) != 0) - goto out; - if (pad != (++i & 0xff)) { - r = SSH_ERR_INVALID_FORMAT; - goto out; - } - } - /* success */ - r = 0; - out: - explicit_bzero(&pad, sizeof(pad)); - explicit_bzero(&i, sizeof(i)); - return r; -} - static int sshkey_parse_private2(struct sshbuf *blob, int type, const char *passphrase, struct sshkey **keyp, char **commentp) From 217b518e0f7c52c4b909e935141a55344c61e644 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 6 May 2022 14:39:34 +1000 Subject: [PATCH 097/287] Add ubsan minimal testcase on OpenBSD. As suggested by djm@. --- .github/workflows/upstream.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index ba0ef8272..0850f777d 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: os: [ obsdsnap, obsdsnap-i386 ] - configs: [ default, without-openssl ] + configs: [ default, without-openssl, ubsan ] steps: - uses: actions/checkout@v2 - name: shutdown VM if running @@ -25,13 +25,15 @@ jobs: - name: update source run: vmrun "cd /usr/src && cvs up -dPA usr.bin/ssh regress/usr.bin/ssh" - name: make clean - run: vmrun "cd /usr/src/usr.bin/ssh && make obj && make clean" + run: vmrun "cd /usr/src/usr.bin/ssh && make obj && make clean && cd /usr/src/regress/usr.bin/ssh && make obj && make clean" - name: make - run: vmrun "cd /usr/src/usr.bin/ssh && if test '${{ matrix.configs }}' = 'without-openssl'; then make OPENSSL=no; else make; fi" + run: vmrun "cd /usr/src/usr.bin/ssh && case ${{ matrix.configs }} in without-openssl) make OPENSSL=no;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" - name: make install run: vmrun "cd /usr/src/usr.bin/ssh && sudo make install" - - name: make tests - run: vmrun "cd /usr/src/regress/usr.bin/ssh && make obj && make clean && if test '${{ matrix.configs }}' = 'without-openssl'; then make SUDO=sudo OPENSSL=no; else make SUDO=sudo; fi" + - name: make tests` + run: vmrun "cd /usr/src/regress/usr.bin/ssh && case ${{ matrix.configs }} in without-openssl) make OPENSSL=no;; ubsan) make DEBUG='-fsanitize-minimal-runtime -fsanitize=undefined';; *) make; esac" + env: + SUDO: sudo timeout-minutes: 300 - name: save logs if: failure() From f87a132800ba3710ab130d703448a31ef1128d77 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 6 May 2022 14:46:09 +1000 Subject: [PATCH 098/287] Note that, for now, we need variadic macros. --- INSTALL | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/INSTALL b/INSTALL index b6e53ab6c..c605182b9 100644 --- a/INSTALL +++ b/INSTALL @@ -1,9 +1,10 @@ 1. Prerequisites ---------------- -A C compiler. Any C89 or better compiler should work. Where supported, -configure will attempt to enable the compiler's run-time integrity checking -options. Some notes about specific compilers: +A C compiler. Any C89 or better compiler that supports variadic macros +should work. Where supported, configure will attempt to enable the +compiler's run-time integrity checking options. Some notes about +specific compilers: - clang: -ftrapv and -sanitize=integer require the compiler-rt runtime (CC=clang LDFLAGS=--rtlib=compiler-rt ./configure) From f38cf74f20b5da113cfa823afd5bfb5c6ba65f3d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 6 May 2022 14:50:18 +1000 Subject: [PATCH 099/287] Also retest OpenBSD upstream on .yml changes. --- .github/workflows/upstream.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 0850f777d..2696838c2 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -3,7 +3,7 @@ name: Upstream self-hosted on: push: branches: [ master, ci ] - paths: [ '**.c', '**.h' ] + paths: [ '**.c', '**.h', '**.yml' ] jobs: selfhosted: From deb506d00da8d11fb04c1e7b9b1e1cc379c1705c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 8 May 2022 22:32:36 +0000 Subject: [PATCH 100/287] upstream: When performing operations that glob(3) a remote path, ensure that the implicit working directory used to construct that path escapes glob(3) characters. This prevents glob characters from being processed in places they shouldn't, e.g. "cd /tmp/a*/", "get *.txt" should have the get operation treat the path "/tmp/a*" literally and not attempt to expand it. Reported by Lusia Kundel; ok markus@ OpenBSD-Commit-ID: 4f647f58482cbad3d58b1eab7f6a1691433deeef --- sftp.c | 49 ++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 38 insertions(+), 11 deletions(-) diff --git a/sftp.c b/sftp.c index 4efc025a5..387132e50 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.214 2022/03/31 03:07:03 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.215 2022/05/08 22:32:36 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -601,18 +601,45 @@ parse_no_flags(const char *cmd, char **argv, int argc) return optind; } +static char * +escape_glob(const char *s) +{ + size_t i, o, len; + char *ret; + + len = strlen(s); + ret = xcalloc(2, len + 1); + for (i = o = 0; i < len; i++) { + if (strchr("[]?*\\", s[i]) != NULL) + ret[o++] = '\\'; + ret[o++] = s[i]; + } + ret[o++] = '\0'; + return ret; +} + +static char * +make_absolute_pwd_glob(const char *p, const char *pwd) +{ + char *ret, *escpwd; + + escpwd = escape_glob(pwd); + if (p == NULL) + return escpwd; + ret = make_absolute(xstrdup(p), escpwd); + free(escpwd); + return ret; +} + static int process_get(struct sftp_conn *conn, const char *src, const char *dst, const char *pwd, int pflag, int rflag, int resume, int fflag) { - char *abs_src = NULL; - char *abs_dst = NULL; + char *filename, *abs_src = NULL, *abs_dst = NULL, *tmp = NULL; glob_t g; - char *filename, *tmp=NULL; int i, r, err = 0; - abs_src = xstrdup(src); - abs_src = make_absolute(abs_src, pwd); + abs_src = make_absolute_pwd_glob(src, pwd); memset(&g, 0, sizeof(g)); debug3("Looking up %s", abs_src); @@ -1565,7 +1592,7 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, err = (sflag ? do_symlink : do_hardlink)(conn, path1, path2); break; case I_RM: - path1 = make_absolute(path1, *pwd); + path1 = make_absolute_pwd_glob(path1, *pwd); remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g); for (i = 0; g.gl_pathv[i] && !interrupted; i++) { if (!quiet) @@ -1626,7 +1653,7 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, if (!path_absolute(path1)) tmp = *pwd; - path1 = make_absolute(path1, *pwd); + path1 = make_absolute_pwd_glob(path1, *pwd); err = do_globbed_ls(conn, path1, tmp, lflag); break; case I_DF: @@ -1666,7 +1693,7 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, printf("Local umask: %03lo\n", n_arg); break; case I_CHMOD: - path1 = make_absolute(path1, *pwd); + path1 = make_absolute_pwd_glob(path1, *pwd); attrib_clear(&a); a.flags |= SSH2_FILEXFER_ATTR_PERMISSIONS; a.perm = n_arg; @@ -1683,7 +1710,7 @@ parse_dispatch_command(struct sftp_conn *conn, const char *cmd, char **pwd, break; case I_CHOWN: case I_CHGRP: - path1 = make_absolute(path1, *pwd); + path1 = make_absolute_pwd_glob(path1, *pwd); remote_glob(conn, path1, GLOB_NOCHECK, NULL, &g); for (i = 0; g.gl_pathv[i] && !interrupted; i++) { if (!(aa = (hflag ? do_lstat : do_stat)(conn, @@ -1958,7 +1985,7 @@ complete_match(EditLine *el, struct sftp_conn *conn, char *remote_path, memset(&g, 0, sizeof(g)); if (remote != LOCAL) { - tmp = make_absolute(tmp, remote_path); + tmp = make_absolute_pwd_glob(tmp, remote_path); remote_glob(conn, tmp, GLOB_DOOFFS|GLOB_MARK, NULL, &g); } else glob(tmp, GLOB_DOOFFS|GLOB_MARK, NULL, &g); From aa61fc82c63d309a90c22ca74fb1da6c6f4372fd Mon Sep 17 00:00:00 2001 From: Tobias Heider Date: Mon, 9 May 2022 02:00:01 +0200 Subject: [PATCH 101/287] Remove duplicate bcrypt_pbkdf.o from Makefile bcrypt_pbkdf.o is duplicated in the openbsd-compat Makefile's object file list. --- openbsd-compat/Makefile.in | 1 - 1 file changed, 1 deletion(-) diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in index 5d53bef57..bca8c42a5 100644 --- a/openbsd-compat/Makefile.in +++ b/openbsd-compat/Makefile.in @@ -20,7 +20,6 @@ LDFLAGS_NOPIE=-L. -Lopenbsd-compat/ @LDFLAGS_NOPIE@ OPENBSD=base64.o \ basename.o \ bcrypt_pbkdf.o \ - bcrypt_pbkdf.o \ bindresvport.o \ blowfish.o \ daemon.o \ From cb010744cc98f651b1029bb09efa986eb54e4ccf Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 8 May 2022 22:58:35 +0000 Subject: [PATCH 102/287] upstream: improve error message when 'ssh-keygen -Y sign' is unable to load a private key; bz3429, reported by Adam Szkoda ok dtucker@ OpenBSD-Commit-ID: bb57b285e67bea536ef81b1055467be2fc380e74 --- ssh-keygen.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index d62fab3e8..dd61be8a0 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.450 2022/03/18 02:32:22 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.451 2022/05/08 22:58:35 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -2462,7 +2462,8 @@ load_sign_key(const char *keypath, const struct sshkey *pubkey) char *privpath = xstrdup(keypath); static const char * const suffixes[] = { "-cert.pub", ".pub", NULL }; struct sshkey *ret = NULL, *privkey = NULL; - int r; + int r, waspub = 0; + struct stat st; /* * If passed a public key filename, then try to locate the corresponding @@ -2477,11 +2478,17 @@ load_sign_key(const char *keypath, const struct sshkey *pubkey) privpath[plen - slen] = '\0'; debug_f("%s looks like a public key, using private key " "path %s instead", keypath, privpath); + waspub = 1; } - if ((privkey = load_identity(privpath, NULL)) == NULL) { - error("Couldn't load identity %s", keypath); - goto done; - } + if (waspub && stat(privpath, &st) != 0 && errno == ENOENT) + fatal("No private key found for public key \"%s\"", keypath); + if ((r = sshkey_load_private(privpath, "", &privkey, NULL)) != 0 && + (r != SSH_ERR_KEY_WRONG_PASSPHRASE)) { + debug_fr(r, "load private key \"%s\"", privpath); + fatal("No private key found for \"%s\"", privpath); + } else if (privkey == NULL) + privkey = load_identity(privpath, NULL); + if (!sshkey_equal_public(pubkey, privkey)) { error("Public key %s doesn't match private %s", keypath, privpath); From 0086a286ea6bbd11ca9b664ac3bb12b27443d6eb Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 9 May 2022 03:09:53 +0000 Subject: [PATCH 103/287] upstream: Allow existing -U (use agent) flag to work with "-Y sign" operations, where it will be interpreted to require that the private keys is hosted in an agent; bz3429, suggested by Adam Szkoda; ok dtucker@ OpenBSD-Commit-ID: a7bc69873b99c32c42c7628ed9ea91565ba08c2f --- ssh-keygen.1 | 8 +++++--- ssh-keygen.c | 19 ++++++++++++------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index 561600dbd..4e7245366 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.221 2022/05/03 07:42:27 florian Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.222 2022/05/09 03:09:53 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 3 2022 $ +.Dd $Mdocdate: May 9 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -583,7 +583,9 @@ and (the default). .It Fl U When used in combination with -.Fl s , +.Fl s +or +.Fl Y Ar sign , this option indicates that a CA key resides in a .Xr ssh-agent 1 . See the diff --git a/ssh-keygen.c b/ssh-keygen.c index dd61be8a0..e76007323 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.451 2022/05/08 22:58:35 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.452 2022/05/09 03:09:53 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -2654,8 +2654,8 @@ sig_process_opts(char * const *opts, size_t nopts, char **hashalgp, static int -sig_sign(const char *keypath, const char *sig_namespace, int argc, char **argv, - char * const *opts, size_t nopts) +sig_sign(const char *keypath, const char *sig_namespace, int require_agent, + int argc, char **argv, char * const *opts, size_t nopts) { int i, fd = -1, r, ret = -1; int agent_fd = -1; @@ -2679,13 +2679,18 @@ sig_sign(const char *keypath, const char *sig_namespace, int argc, char **argv, goto done; } - if ((r = ssh_get_authentication_socket(&agent_fd)) != 0) + if ((r = ssh_get_authentication_socket(&agent_fd)) != 0) { + if (require_agent) + fatal("Couldn't get agent socket"); debug_r(r, "Couldn't get agent socket"); - else { + } else { if ((r = ssh_agent_has_key(agent_fd, pubkey)) == 0) signer = agent_signer; - else + else { + if (require_agent) + fatal("Couldn't find key in agent"); debug_r(r, "Couldn't find key in agent"); + } } if (signer == NULL) { @@ -3543,7 +3548,7 @@ main(int argc, char **argv) exit(1); } return sig_sign(identity_file, cert_principals, - argc, argv, opts, nopts); + prefer_agent, argc, argv, opts, nopts); } else if (strncmp(sign_op, "check-novalidate", 16) == 0) { /* NB. cert_principals is actually namespace, via -n */ if (cert_principals == NULL || From fbcef70c2832712f027bccea1aa9bc4b4103da93 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 9 May 2022 08:25:27 +0000 Subject: [PATCH 104/287] upstream: Remove errant apostrophe. From haruyama at queen-ml org. OpenBSD-Commit-ID: dc6b294567cb84b384ad6ced9ca469f2bbf0bd10 --- PROTOCOL.agent | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PROTOCOL.agent b/PROTOCOL.agent index 67302c344..ec2c47b63 100644 --- a/PROTOCOL.agent +++ b/PROTOCOL.agent @@ -1,7 +1,7 @@ The SSH agent protocol is described in https://tools.ietf.org/html/draft-miller-ssh-agent-04 -This file document's OpenSSH's extensions to the agent protocol. +This file documents OpenSSH's extensions to the agent protocol. 1. session-bind@openssh.com extension @@ -81,4 +81,4 @@ the constraint is: This option is only valid for XMSS keys. -$OpenBSD: PROTOCOL.agent,v 1.16 2022/01/01 01:55:30 jsg Exp $ +$OpenBSD: PROTOCOL.agent,v 1.17 2022/05/09 08:25:27 dtucker Exp $ From 56a0697fe079ff3e1ba30a2d5c26b5e45f7b71f8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 13 May 2022 06:31:50 +0000 Subject: [PATCH 105/287] upstream: arrange for scp, when in sftp mode, to not ftruncate(3) files early previous behavious of unconditionally truncating the destination file would cause "scp ~/foo localhost:" and "scp localhost:foo ~/" to delete all the contents of their destination. spotted by solene@ sthen@, also bz3431; ok dtucker@ OpenBSD-Commit-ID: ca39fdd39e0ec1466b9666f15cbcfddea6aaa179 --- scp.c | 10 ++++---- sftp-client.c | 70 +++++++++++++++++++++++++++++++++------------------ sftp-client.h | 17 +++++++------ sftp.c | 10 ++++---- 4 files changed, 64 insertions(+), 43 deletions(-) diff --git a/scp.c b/scp.c index c36d66aa5..da07e64ec 100644 --- a/scp.c +++ b/scp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scp.c,v 1.247 2022/03/20 08:52:17 djm Exp $ */ +/* $OpenBSD: scp.c,v 1.248 2022/05/13 06:31:50 djm Exp $ */ /* * scp - secure remote copy. This is basically patched BSD rcp which * uses ssh to do the data transfer (instead of using rcmd). @@ -1311,11 +1311,11 @@ source_sftp(int argc, char *src, char *targ, struct sftp_conn *conn) if (src_is_dir && iamrecursive) { if (upload_dir(conn, src, abs_dst, pflag, - SFTP_PROGRESS_ONLY, 0, 0, 1) != 0) { + SFTP_PROGRESS_ONLY, 0, 0, 1, 1) != 0) { error("failed to upload directory %s to %s", src, targ); errs = 1; } - } else if (do_upload(conn, src, abs_dst, pflag, 0, 0) != 0) { + } else if (do_upload(conn, src, abs_dst, pflag, 0, 0, 1) != 0) { error("failed to upload file %s to %s", src, targ); errs = 1; } @@ -1552,11 +1552,11 @@ sink_sftp(int argc, char *dst, const char *src, struct sftp_conn *conn) debug("Fetching %s to %s\n", g.gl_pathv[i], abs_dst); if (globpath_is_dir(g.gl_pathv[i]) && iamrecursive) { if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, - pflag, SFTP_PROGRESS_ONLY, 0, 0, 1) == -1) + pflag, SFTP_PROGRESS_ONLY, 0, 0, 1, 1) == -1) err = -1; } else { if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, - pflag, 0, 0) == -1) + pflag, 0, 0, 1) == -1) err = -1; } free(abs_dst); diff --git a/sftp-client.c b/sftp-client.c index 1b8ce6d78..dffb35a2f 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.162 2022/03/31 03:07:03 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.163 2022/05/13 06:31:50 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -1580,7 +1580,7 @@ progress_meter_path(const char *path) int do_download(struct sftp_conn *conn, const char *remote_path, const char *local_path, Attrib *a, int preserve_flag, int resume_flag, - int fsync_flag) + int fsync_flag, int inplace_flag) { struct sshbuf *msg; u_char *handle; @@ -1627,8 +1627,8 @@ do_download(struct sftp_conn *conn, const char *remote_path, &handle, &handle_len) != 0) return -1; - local_fd = open(local_path, - O_WRONLY | O_CREAT | (resume_flag ? 0 : O_TRUNC), mode | S_IWUSR); + local_fd = open(local_path, O_WRONLY | O_CREAT | + ((resume_flag || inplace_flag) ? 0 : O_TRUNC), mode | S_IWUSR); if (local_fd == -1) { error("open local \"%s\": %s", local_path, strerror(errno)); goto fail; @@ -1851,7 +1851,7 @@ do_download(struct sftp_conn *conn, const char *remote_path, static int download_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, int depth, Attrib *dirattrib, int preserve_flag, int print_flag, - int resume_flag, int fsync_flag, int follow_link_flag) + int resume_flag, int fsync_flag, int follow_link_flag, int inplace_flag) { int i, ret = 0; SFTP_DIRENT **dir_entries; @@ -1910,7 +1910,7 @@ download_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, if (download_dir_internal(conn, new_src, new_dst, depth + 1, &(dir_entries[i]->a), preserve_flag, print_flag, resume_flag, - fsync_flag, follow_link_flag) == -1) + fsync_flag, follow_link_flag, inplace_flag) == -1) ret = -1; } else if (S_ISREG(dir_entries[i]->a.perm) || (follow_link_flag && S_ISLNK(dir_entries[i]->a.perm))) { @@ -1922,7 +1922,8 @@ download_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, if (do_download(conn, new_src, new_dst, S_ISLNK(dir_entries[i]->a.perm) ? NULL : &(dir_entries[i]->a), - preserve_flag, resume_flag, fsync_flag) == -1) { + preserve_flag, resume_flag, fsync_flag, + inplace_flag) == -1) { error("Download of file %s to %s failed", new_src, new_dst); ret = -1; @@ -1960,7 +1961,7 @@ download_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, int download_dir(struct sftp_conn *conn, const char *src, const char *dst, Attrib *dirattrib, int preserve_flag, int print_flag, int resume_flag, - int fsync_flag, int follow_link_flag) + int fsync_flag, int follow_link_flag, int inplace_flag) { char *src_canon; int ret; @@ -1972,26 +1973,25 @@ download_dir(struct sftp_conn *conn, const char *src, const char *dst, ret = download_dir_internal(conn, src_canon, dst, 0, dirattrib, preserve_flag, print_flag, resume_flag, fsync_flag, - follow_link_flag); + follow_link_flag, inplace_flag); free(src_canon); return ret; } int do_upload(struct sftp_conn *conn, const char *local_path, - const char *remote_path, int preserve_flag, int resume, int fsync_flag) + const char *remote_path, int preserve_flag, int resume, + int fsync_flag, int inplace_flag) { int r, local_fd; - u_int status = SSH2_FX_OK; - u_int id; - u_char type; + u_int openmode, id, status = SSH2_FX_OK, reordered = 0; off_t offset, progress_counter; - u_char *handle, *data; + u_char type, *handle, *data; struct sshbuf *msg; struct stat sb; - Attrib a, *c = NULL; - u_int32_t startid; - u_int32_t ackid; + Attrib a, t, *c = NULL; + u_int32_t startid, ackid; + u_int64_t highwater = 0; struct request *ack = NULL; struct requests acks; size_t handle_len; @@ -2043,10 +2043,15 @@ do_upload(struct sftp_conn *conn, const char *local_path, } } + openmode = SSH2_FXF_WRITE|SSH2_FXF_CREAT; + if (resume) + openmode |= SSH2_FXF_APPEND; + else if (!inplace_flag) + openmode |= SSH2_FXF_TRUNC; + /* Send open request */ - if (send_open(conn, remote_path, "dest", SSH2_FXF_WRITE|SSH2_FXF_CREAT| - (resume ? SSH2_FXF_APPEND : SSH2_FXF_TRUNC), - &a, &handle, &handle_len) != 0) { + if (send_open(conn, remote_path, "dest", openmode, &a, + &handle, &handle_len) != 0) { close(local_fd); return -1; } @@ -2128,6 +2133,12 @@ do_upload(struct sftp_conn *conn, const char *local_path, ack->id, ack->len, (unsigned long long)ack->offset); ++ackid; progress_counter += ack->len; + if (!reordered && ack->offset <= highwater) + highwater = ack->offset + ack->len; + else if (!reordered && ack->offset > highwater) { + debug3_f("server reordered ACKs"); + reordered = 1; + } free(ack); } offset += len; @@ -2145,6 +2156,14 @@ do_upload(struct sftp_conn *conn, const char *local_path, status = SSH2_FX_FAILURE; } + if ((resume || inplace_flag) && (status != SSH2_FX_OK || interrupted)) { + debug("truncating at %llu", (unsigned long long)highwater); + attrib_clear(&t); + t.flags = SSH2_FILEXFER_ATTR_SIZE; + t.size = highwater; + do_fsetstat(conn, handle, handle_len, &a); + } + if (close(local_fd) == -1) { error("close local \"%s\": %s", local_path, strerror(errno)); status = SSH2_FX_FAILURE; @@ -2168,7 +2187,7 @@ do_upload(struct sftp_conn *conn, const char *local_path, static int upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, int depth, int preserve_flag, int print_flag, int resume, int fsync_flag, - int follow_link_flag) + int follow_link_flag, int inplace_flag) { int ret = 0; DIR *dirp; @@ -2246,12 +2265,13 @@ upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, if (upload_dir_internal(conn, new_src, new_dst, depth + 1, preserve_flag, print_flag, resume, - fsync_flag, follow_link_flag) == -1) + fsync_flag, follow_link_flag, inplace_flag) == -1) ret = -1; } else if (S_ISREG(sb.st_mode) || (follow_link_flag && S_ISLNK(sb.st_mode))) { if (do_upload(conn, new_src, new_dst, - preserve_flag, resume, fsync_flag) == -1) { + preserve_flag, resume, fsync_flag, + inplace_flag) == -1) { error("upload \"%s\" to \"%s\" failed", new_src, new_dst); ret = -1; @@ -2271,7 +2291,7 @@ upload_dir_internal(struct sftp_conn *conn, const char *src, const char *dst, int upload_dir(struct sftp_conn *conn, const char *src, const char *dst, int preserve_flag, int print_flag, int resume, int fsync_flag, - int follow_link_flag) + int follow_link_flag, int inplace_flag) { char *dst_canon; int ret; @@ -2282,7 +2302,7 @@ upload_dir(struct sftp_conn *conn, const char *src, const char *dst, } ret = upload_dir_internal(conn, src, dst_canon, 0, preserve_flag, - print_flag, resume, fsync_flag, follow_link_flag); + print_flag, resume, fsync_flag, follow_link_flag, inplace_flag); free(dst_canon); return ret; diff --git a/sftp-client.h b/sftp-client.h index 282a4c700..7ca6e8ad9 100644 --- a/sftp-client.h +++ b/sftp-client.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.h,v 1.36 2022/03/31 03:07:03 djm Exp $ */ +/* $OpenBSD: sftp-client.h,v 1.37 2022/05/13 06:31:50 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller @@ -141,28 +141,29 @@ int do_fsync(struct sftp_conn *conn, u_char *, u_int); * Download 'remote_path' to 'local_path'. Preserve permissions and times * if 'pflag' is set */ -int do_download(struct sftp_conn *, const char *, const char *, - Attrib *, int, int, int); +int do_download(struct sftp_conn *, const char *, const char *, Attrib *, + int, int, int, int); /* * Recursively download 'remote_directory' to 'local_directory'. Preserve * times if 'pflag' is set */ -int download_dir(struct sftp_conn *, const char *, const char *, - Attrib *, int, int, int, int, int); +int download_dir(struct sftp_conn *, const char *, const char *, Attrib *, + int, int, int, int, int, int); /* * Upload 'local_path' to 'remote_path'. Preserve permissions and times * if 'pflag' is set */ -int do_upload(struct sftp_conn *, const char *, const char *, int, int, int); +int do_upload(struct sftp_conn *, const char *, const char *, + int, int, int, int); /* * Recursively upload 'local_directory' to 'remote_directory'. Preserve * times if 'pflag' is set */ -int upload_dir(struct sftp_conn *, const char *, const char *, int, int, int, - int, int); +int upload_dir(struct sftp_conn *, const char *, const char *, + int, int, int, int, int, int); /* * Download a 'from_path' from the 'from' connection and upload it to diff --git a/sftp.c b/sftp.c index 387132e50..41c7f1c9f 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.215 2022/05/08 22:32:36 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.216 2022/05/13 06:31:50 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -697,12 +697,12 @@ process_get(struct sftp_conn *conn, const char *src, const char *dst, if (globpath_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { if (download_dir(conn, g.gl_pathv[i], abs_dst, NULL, pflag || global_pflag, 1, resume, - fflag || global_fflag, 0) == -1) + fflag || global_fflag, 0, 0) == -1) err = -1; } else { if (do_download(conn, g.gl_pathv[i], abs_dst, NULL, pflag || global_pflag, resume, - fflag || global_fflag) == -1) + fflag || global_fflag, 0) == -1) err = -1; } free(abs_dst); @@ -791,12 +791,12 @@ process_put(struct sftp_conn *conn, const char *src, const char *dst, if (globpath_is_dir(g.gl_pathv[i]) && (rflag || global_rflag)) { if (upload_dir(conn, g.gl_pathv[i], abs_dst, pflag || global_pflag, 1, resume, - fflag || global_fflag, 0) == -1) + fflag || global_fflag, 0, 0) == -1) err = -1; } else { if (do_upload(conn, g.gl_pathv[i], abs_dst, pflag || global_pflag, resume, - fflag || global_fflag) == -1) + fflag || global_fflag, 0) == -1) err = -1; } } From 9b73345f80255a7f3048026462f2c0c6a241eeac Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 15 May 2022 23:47:21 +0000 Subject: [PATCH 106/287] upstream: fix in-place copies; r1.163 incorrectly skipped truncation in all cases, not just at the start of a transfer. This could cause overwrites of larger files to leave junk at the end. Spotted by tb@ OpenBSD-Commit-ID: b189f19cd68119548c8e24e39c79f61e115bf92c --- sftp-client.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/sftp-client.c b/sftp-client.c index dffb35a2f..310d44e5e 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.163 2022/05/13 06:31:50 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.164 2022/05/15 23:47:21 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -1789,8 +1789,11 @@ do_download(struct sftp_conn *conn, const char *remote_path, /* Sanity check */ if (TAILQ_FIRST(&requests) != NULL) fatal("Transfer complete, but requests still in queue"); - /* Truncate at highest contiguous point to avoid holes on interrupt */ - if (read_error || write_error || interrupted) { + /* + * Truncate at highest contiguous point to avoid holes on interrupt, + * or unconditionally if writing in place. + */ + if (inplace_flag || read_error || write_error || interrupted) { if (reordered && resume_flag) { error("Unable to resume download of \"%s\": " "server reordered requests", local_path); @@ -2156,12 +2159,12 @@ do_upload(struct sftp_conn *conn, const char *local_path, status = SSH2_FX_FAILURE; } - if ((resume || inplace_flag) && (status != SSH2_FX_OK || interrupted)) { + if (inplace_flag || (resume && (status != SSH2_FX_OK || interrupted))) { debug("truncating at %llu", (unsigned long long)highwater); attrib_clear(&t); t.flags = SSH2_FILEXFER_ATTR_SIZE; t.size = highwater; - do_fsetstat(conn, handle, handle_len, &a); + do_fsetstat(conn, handle, handle_len, &t); } if (close(local_fd) == -1) { From b4f0d719c2548cb74da509fb65f384dada4ebd37 Mon Sep 17 00:00:00 2001 From: "anton@openbsd.org" Date: Fri, 22 Apr 2022 05:08:43 +0000 Subject: [PATCH 107/287] upstream: Only run agent-ptrace.sh if gdb is available as all architectures do not ship with gdb. OpenBSD-Regress-ID: ec53e928803e6b87f9ac142d38888ca79a45348d --- regress/agent-ptrace.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/agent-ptrace.sh b/regress/agent-ptrace.sh index 9cd68d7ec..feef52416 100644 --- a/regress/agent-ptrace.sh +++ b/regress/agent-ptrace.sh @@ -1,4 +1,4 @@ -# $OpenBSD: agent-ptrace.sh,v 1.3 2015/09/11 04:55:01 djm Exp $ +# $OpenBSD: agent-ptrace.sh,v 1.5 2022/04/22 05:08:43 anton Exp $ # Placed in the Public Domain. tid="disallow agent ptrace attach" From bedb93415b60db3dfd704a3d525e82adb14a2481 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sun, 15 May 2022 23:48:07 +0000 Subject: [PATCH 108/287] upstream: regress test for in-place transfers and clobbering larger files with smaller ones; would have caught last regression in scp(1) OpenBSD-Regress-ID: 19de4e88dd3a4f7e5c1618c9be3c32415bd93bc2 --- regress/scp.sh | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/regress/scp.sh b/regress/scp.sh index 358a8df66..f47c59457 100644 --- a/regress/scp.sh +++ b/regress/scp.sh @@ -1,4 +1,4 @@ -# $OpenBSD: scp.sh,v 1.13 2021/08/10 03:35:45 djm Exp $ +# $OpenBSD: scp.sh,v 1.14 2022/05/15 23:48:07 djm Exp $ # Placed in the Public Domain. tid="scp" @@ -49,6 +49,31 @@ for mode in scp sftp ; do $SCP $scpopts somehost:${DATA} ${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" + verbose "$tag: copy local file to remote file in place" + scpclean + cp ${DATA} ${COPY} + $SCP $scpopts ${COPY} somehost:${COPY} || fail "copy failed" + cmp ${DATA} ${COPY} || fail "corrupted copy" + + verbose "$tag: copy remote file to local file in place" + scpclean + cp ${DATA} ${COPY} + $SCP $scpopts somehost:${COPY} ${COPY} || fail "copy failed" + cmp ${DATA} ${COPY} || fail "corrupted copy" + + verbose "$tag: copy local file to remote file clobber" + scpclean + cat ${DATA} ${DATA} > ${COPY} + $SCP $scpopts ${DATA} somehost:${COPY} || fail "copy failed" + ls -l $DATA $COPY + cmp ${DATA} ${COPY} || fail "corrupted copy" + + verbose "$tag: copy remote file to local file clobber" + scpclean + cat ${DATA} ${DATA} > ${COPY} + $SCP $scpopts somehost:${DATA} ${COPY} || fail "copy failed" + cmp ${DATA} ${COPY} || fail "corrupted copy" + verbose "$tag: simple copy local file to remote dir" scpclean cp ${DATA} ${COPY} From 2487163630f28be28b7e2396b4bd6511b98f1d3e Mon Sep 17 00:00:00 2001 From: Tim Rice Date: Tue, 24 May 2022 10:21:25 -0700 Subject: [PATCH 109/287] configure.ac: Add missing AC_DEFINE for caph_cache_tzdata test causing HAVE_CAPH_CACHE_TZDATA to be missing from config.h.in. Spotted by Bryan Drewery --- configure.ac | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index f25a638ea..e7459ee1a 100644 --- a/configure.ac +++ b/configure.ac @@ -514,7 +514,11 @@ AC_MSG_CHECKING([for caph_cache_tzdata]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ #include ]], [[caph_cache_tzdata();]])], - [ AC_MSG_RESULT([yes]) ], + [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CAPH_CACHE_TZDATA], [1], + [Define if you have caph_cache_tzdata]) + ], [ AC_MSG_RESULT([no]) ] ) From 9e0d02ef7ce88b67643bfb1c2272c9f5f04cc680 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 25 May 2022 00:31:13 +0000 Subject: [PATCH 110/287] upstream: make SSHBUF_DBG/SSHBUF_TELL (off by default and only enabled via #define) dump to stderr rather than stdout OpenBSD-Commit-ID: 10298513ee32db8390aecb0397d782d68cb14318 --- sshbuf-getput-basic.c | 22 +++++++++++----------- sshbuf-getput-crypto.c | 8 ++++---- sshbuf.c | 24 ++++++++++++------------ sshbuf.h | 17 +++++++++-------- 4 files changed, 36 insertions(+), 35 deletions(-) diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c index 9803fb5ed..dcec0364b 100644 --- a/sshbuf-getput-basic.c +++ b/sshbuf-getput-basic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-getput-basic.c,v 1.11 2020/06/05 03:25:35 djm Exp $ */ +/* $OpenBSD: sshbuf-getput-basic.c,v 1.12 2022/05/25 00:31:13 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -198,7 +198,7 @@ sshbuf_get_string(struct sshbuf *buf, u_char **valp, size_t *lenp) return r; if (valp != NULL) { if ((*valp = malloc(len + 1)) == NULL) { - SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); + SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); return SSH_ERR_ALLOC_FAIL; } if (len != 0) @@ -229,7 +229,7 @@ sshbuf_get_string_direct(struct sshbuf *buf, const u_char **valp, size_t *lenp) *lenp = len; if (sshbuf_consume(buf, len + 4) != 0) { /* Shouldn't happen */ - SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); + SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } @@ -248,16 +248,16 @@ sshbuf_peek_string_direct(const struct sshbuf *buf, const u_char **valp, if (lenp != NULL) *lenp = 0; if (sshbuf_len(buf) < 4) { - SSHBUF_DBG(("SSH_ERR_MESSAGE_INCOMPLETE")); + SSHBUF_DBG("SSH_ERR_MESSAGE_INCOMPLETE"); return SSH_ERR_MESSAGE_INCOMPLETE; } len = PEEK_U32(p); if (len > SSHBUF_SIZE_MAX - 4) { - SSHBUF_DBG(("SSH_ERR_STRING_TOO_LARGE")); + SSHBUF_DBG("SSH_ERR_STRING_TOO_LARGE"); return SSH_ERR_STRING_TOO_LARGE; } if (sshbuf_len(buf) - 4 < len) { - SSHBUF_DBG(("SSH_ERR_MESSAGE_INCOMPLETE")); + SSHBUF_DBG("SSH_ERR_MESSAGE_INCOMPLETE"); return SSH_ERR_MESSAGE_INCOMPLETE; } if (valp != NULL) @@ -283,14 +283,14 @@ sshbuf_get_cstring(struct sshbuf *buf, char **valp, size_t *lenp) /* Allow a \0 only at the end of the string */ if (len > 0 && (z = memchr(p , '\0', len)) != NULL && z < p + len - 1) { - SSHBUF_DBG(("SSH_ERR_INVALID_FORMAT")); + SSHBUF_DBG("SSH_ERR_INVALID_FORMAT"); return SSH_ERR_INVALID_FORMAT; } if ((r = sshbuf_skip_string(buf)) != 0) return -1; if (valp != NULL) { if ((*valp = malloc(len + 1)) == NULL) { - SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); + SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); return SSH_ERR_ALLOC_FAIL; } if (len != 0) @@ -517,7 +517,7 @@ sshbuf_put_string(struct sshbuf *buf, const void *v, size_t len) int r; if (len > SSHBUF_SIZE_MAX - 4) { - SSHBUF_DBG(("SSH_ERR_NO_BUFFER_SPACE")); + SSHBUF_DBG("SSH_ERR_NO_BUFFER_SPACE"); return SSH_ERR_NO_BUFFER_SPACE; } if ((r = sshbuf_reserve(buf, len + 4, &d)) < 0) @@ -575,7 +575,7 @@ sshbuf_put_bignum2_bytes(struct sshbuf *buf, const void *v, size_t len) int r, prepend; if (len > SSHBUF_SIZE_MAX - 5) { - SSHBUF_DBG(("SSH_ERR_NO_BUFFER_SPACE")); + SSHBUF_DBG("SSH_ERR_NO_BUFFER_SPACE"); return SSH_ERR_NO_BUFFER_SPACE; } /* Skip leading zero bytes */ @@ -625,7 +625,7 @@ sshbuf_get_bignum2_bytes_direct(struct sshbuf *buf, *lenp = len; if (sshbuf_consume(buf, olen + 4) != 0) { /* Shouldn't happen */ - SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); + SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } diff --git a/sshbuf-getput-crypto.c b/sshbuf-getput-crypto.c index 2e61d3bcd..0a7229918 100644 --- a/sshbuf-getput-crypto.c +++ b/sshbuf-getput-crypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-getput-crypto.c,v 1.8 2019/11/15 06:00:20 djm Exp $ */ +/* $OpenBSD: sshbuf-getput-crypto.c,v 1.9 2022/05/25 00:31:13 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -84,7 +84,7 @@ sshbuf_get_ec(struct sshbuf *buf, EC_POINT *v, const EC_GROUP *g) /* Skip string */ if (sshbuf_get_string_direct(buf, NULL, NULL) != 0) { /* Shouldn't happen */ - SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); + SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } @@ -100,7 +100,7 @@ sshbuf_get_eckey(struct sshbuf *buf, EC_KEY *v) size_t len; if (pt == NULL) { - SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); + SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); return SSH_ERR_ALLOC_FAIL; } if ((r = sshbuf_peek_string_direct(buf, &d, &len)) < 0) { @@ -119,7 +119,7 @@ sshbuf_get_eckey(struct sshbuf *buf, EC_KEY *v) /* Skip string */ if (sshbuf_get_string_direct(buf, NULL, NULL) != 0) { /* Shouldn't happen */ - SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); + SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } diff --git a/sshbuf.c b/sshbuf.c index 840b899b1..0e873ef1d 100644 --- a/sshbuf.c +++ b/sshbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.c,v 1.16 2022/04/08 04:40:40 djm Exp $ */ +/* $OpenBSD: sshbuf.c,v 1.17 2022/05/25 00:31:13 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -41,7 +41,7 @@ sshbuf_check_sanity(const struct sshbuf *buf) buf->size > buf->alloc || buf->off > buf->size)) { /* Do not try to recover from corrupted buffer internals */ - SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); + SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); ssh_signal(SIGSEGV, SIG_DFL); raise(SIGSEGV); return SSH_ERR_INTERNAL_ERROR; @@ -52,7 +52,7 @@ sshbuf_check_sanity(const struct sshbuf *buf) static void sshbuf_maybe_pack(struct sshbuf *buf, int force) { - SSHBUF_DBG(("force %d", force)); + SSHBUF_DBG("force %d", force); SSHBUF_TELL("pre-pack"); if (buf->off == 0 || buf->readonly || buf->refcount > 1) return; @@ -223,7 +223,7 @@ sshbuf_set_max_size(struct sshbuf *buf, size_t max_size) u_char *dp; int r; - SSHBUF_DBG(("set max buf = %p len = %zu", buf, max_size)); + SSHBUF_DBG("set max buf = %p len = %zu", buf, max_size); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (max_size == buf->max_size) @@ -241,7 +241,7 @@ sshbuf_set_max_size(struct sshbuf *buf, size_t max_size) rlen = ROUNDUP(buf->size, SSHBUF_SIZE_INC); if (rlen > max_size) rlen = max_size; - SSHBUF_DBG(("new alloc = %zu", rlen)); + SSHBUF_DBG("new alloc = %zu", rlen); if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) return SSH_ERR_ALLOC_FAIL; buf->cd = buf->d = dp; @@ -309,7 +309,7 @@ sshbuf_allocate(struct sshbuf *buf, size_t len) u_char *dp; int r; - SSHBUF_DBG(("allocate buf = %p len = %zu", buf, len)); + SSHBUF_DBG("allocate buf = %p len = %zu", buf, len); if ((r = sshbuf_check_reserve(buf, len)) != 0) return r; /* @@ -327,12 +327,12 @@ sshbuf_allocate(struct sshbuf *buf, size_t len) */ need = len + buf->size - buf->alloc; rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC); - SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen)); + SSHBUF_DBG("need %zu initial rlen %zu", need, rlen); if (rlen > buf->max_size) rlen = buf->alloc + need; - SSHBUF_DBG(("adjusted rlen %zu", rlen)); + SSHBUF_DBG("adjusted rlen %zu", rlen); if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) { - SSHBUF_DBG(("realloc fail")); + SSHBUF_DBG("realloc fail"); return SSH_ERR_ALLOC_FAIL; } buf->alloc = rlen; @@ -354,7 +354,7 @@ sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) if (dpp != NULL) *dpp = NULL; - SSHBUF_DBG(("reserve buf = %p len = %zu", buf, len)); + SSHBUF_DBG("reserve buf = %p len = %zu", buf, len); if ((r = sshbuf_allocate(buf, len)) != 0) return r; @@ -370,7 +370,7 @@ sshbuf_consume(struct sshbuf *buf, size_t len) { int r; - SSHBUF_DBG(("len = %zu", len)); + SSHBUF_DBG("len = %zu", len); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (len == 0) @@ -390,7 +390,7 @@ sshbuf_consume_end(struct sshbuf *buf, size_t len) { int r; - SSHBUF_DBG(("len = %zu", len)); + SSHBUF_DBG("len = %zu", len); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (len == 0) diff --git a/sshbuf.h b/sshbuf.h index 07d54f0a9..935302033 100644 --- a/sshbuf.h +++ b/sshbuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.25 2022/01/22 00:43:43 djm Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.26 2022/05/25 00:31:13 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -395,16 +395,17 @@ u_int sshbuf_refcount(const struct sshbuf *buf); # ifdef SSHBUF_DEBUG # define SSHBUF_TELL(what) do { \ - printf("%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ + fprintf(stderr, \ + "%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ __FILE__, __LINE__, __func__, what, \ buf->size, buf->alloc, buf->off, buf->max_size); \ - fflush(stdout); \ + fflush(stderr); \ } while (0) -# define SSHBUF_DBG(x) do { \ - printf("%s:%d %s: ", __FILE__, __LINE__, __func__); \ - printf x; \ - printf("\n"); \ - fflush(stdout); \ +# define SSHBUF_DBG(...) do { \ + fprintf(stderr, "%s:%d %s: ", __FILE__, __LINE__, __func__); \ + fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); \ + fflush(stderr); \ } while (0) # else # define SSHBUF_TELL(what) From 9d8c80f8a304babe61ca28f2e3fb5eb6dc9c39bf Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 25 May 2022 06:03:44 +0000 Subject: [PATCH 111/287] upstream: revert previous; it was broken (spotted by Theo) OpenBSD-Commit-ID: 457c79afaca2f89ec2606405c1059b98b30d8b0d --- sshbuf-getput-basic.c | 22 +++++++++++----------- sshbuf-getput-crypto.c | 8 ++++---- sshbuf.c | 24 ++++++++++++------------ sshbuf.h | 17 ++++++++--------- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/sshbuf-getput-basic.c b/sshbuf-getput-basic.c index dcec0364b..5c71b0e53 100644 --- a/sshbuf-getput-basic.c +++ b/sshbuf-getput-basic.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-getput-basic.c,v 1.12 2022/05/25 00:31:13 djm Exp $ */ +/* $OpenBSD: sshbuf-getput-basic.c,v 1.13 2022/05/25 06:03:44 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -198,7 +198,7 @@ sshbuf_get_string(struct sshbuf *buf, u_char **valp, size_t *lenp) return r; if (valp != NULL) { if ((*valp = malloc(len + 1)) == NULL) { - SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); + SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); return SSH_ERR_ALLOC_FAIL; } if (len != 0) @@ -229,7 +229,7 @@ sshbuf_get_string_direct(struct sshbuf *buf, const u_char **valp, size_t *lenp) *lenp = len; if (sshbuf_consume(buf, len + 4) != 0) { /* Shouldn't happen */ - SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); + SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } @@ -248,16 +248,16 @@ sshbuf_peek_string_direct(const struct sshbuf *buf, const u_char **valp, if (lenp != NULL) *lenp = 0; if (sshbuf_len(buf) < 4) { - SSHBUF_DBG("SSH_ERR_MESSAGE_INCOMPLETE"); + SSHBUF_DBG(("SSH_ERR_MESSAGE_INCOMPLETE")); return SSH_ERR_MESSAGE_INCOMPLETE; } len = PEEK_U32(p); if (len > SSHBUF_SIZE_MAX - 4) { - SSHBUF_DBG("SSH_ERR_STRING_TOO_LARGE"); + SSHBUF_DBG(("SSH_ERR_STRING_TOO_LARGE")); return SSH_ERR_STRING_TOO_LARGE; } if (sshbuf_len(buf) - 4 < len) { - SSHBUF_DBG("SSH_ERR_MESSAGE_INCOMPLETE"); + SSHBUF_DBG(("SSH_ERR_MESSAGE_INCOMPLETE")); return SSH_ERR_MESSAGE_INCOMPLETE; } if (valp != NULL) @@ -283,14 +283,14 @@ sshbuf_get_cstring(struct sshbuf *buf, char **valp, size_t *lenp) /* Allow a \0 only at the end of the string */ if (len > 0 && (z = memchr(p , '\0', len)) != NULL && z < p + len - 1) { - SSHBUF_DBG("SSH_ERR_INVALID_FORMAT"); + SSHBUF_DBG(("SSH_ERR_INVALID_FORMAT")); return SSH_ERR_INVALID_FORMAT; } if ((r = sshbuf_skip_string(buf)) != 0) return -1; if (valp != NULL) { if ((*valp = malloc(len + 1)) == NULL) { - SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); + SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); return SSH_ERR_ALLOC_FAIL; } if (len != 0) @@ -517,7 +517,7 @@ sshbuf_put_string(struct sshbuf *buf, const void *v, size_t len) int r; if (len > SSHBUF_SIZE_MAX - 4) { - SSHBUF_DBG("SSH_ERR_NO_BUFFER_SPACE"); + SSHBUF_DBG(("SSH_ERR_NO_BUFFER_SPACE")); return SSH_ERR_NO_BUFFER_SPACE; } if ((r = sshbuf_reserve(buf, len + 4, &d)) < 0) @@ -575,7 +575,7 @@ sshbuf_put_bignum2_bytes(struct sshbuf *buf, const void *v, size_t len) int r, prepend; if (len > SSHBUF_SIZE_MAX - 5) { - SSHBUF_DBG("SSH_ERR_NO_BUFFER_SPACE"); + SSHBUF_DBG(("SSH_ERR_NO_BUFFER_SPACE")); return SSH_ERR_NO_BUFFER_SPACE; } /* Skip leading zero bytes */ @@ -625,7 +625,7 @@ sshbuf_get_bignum2_bytes_direct(struct sshbuf *buf, *lenp = len; if (sshbuf_consume(buf, olen + 4) != 0) { /* Shouldn't happen */ - SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); + SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } diff --git a/sshbuf-getput-crypto.c b/sshbuf-getput-crypto.c index 0a7229918..56ffdd861 100644 --- a/sshbuf-getput-crypto.c +++ b/sshbuf-getput-crypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-getput-crypto.c,v 1.9 2022/05/25 00:31:13 djm Exp $ */ +/* $OpenBSD: sshbuf-getput-crypto.c,v 1.10 2022/05/25 06:03:44 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -84,7 +84,7 @@ sshbuf_get_ec(struct sshbuf *buf, EC_POINT *v, const EC_GROUP *g) /* Skip string */ if (sshbuf_get_string_direct(buf, NULL, NULL) != 0) { /* Shouldn't happen */ - SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); + SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } @@ -100,7 +100,7 @@ sshbuf_get_eckey(struct sshbuf *buf, EC_KEY *v) size_t len; if (pt == NULL) { - SSHBUF_DBG("SSH_ERR_ALLOC_FAIL"); + SSHBUF_DBG(("SSH_ERR_ALLOC_FAIL")); return SSH_ERR_ALLOC_FAIL; } if ((r = sshbuf_peek_string_direct(buf, &d, &len)) < 0) { @@ -119,7 +119,7 @@ sshbuf_get_eckey(struct sshbuf *buf, EC_KEY *v) /* Skip string */ if (sshbuf_get_string_direct(buf, NULL, NULL) != 0) { /* Shouldn't happen */ - SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); + SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); SSHBUF_ABORT(); return SSH_ERR_INTERNAL_ERROR; } diff --git a/sshbuf.c b/sshbuf.c index 0e873ef1d..d5757b726 100644 --- a/sshbuf.c +++ b/sshbuf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.c,v 1.17 2022/05/25 00:31:13 djm Exp $ */ +/* $OpenBSD: sshbuf.c,v 1.18 2022/05/25 06:03:44 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -41,7 +41,7 @@ sshbuf_check_sanity(const struct sshbuf *buf) buf->size > buf->alloc || buf->off > buf->size)) { /* Do not try to recover from corrupted buffer internals */ - SSHBUF_DBG("SSH_ERR_INTERNAL_ERROR"); + SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); ssh_signal(SIGSEGV, SIG_DFL); raise(SIGSEGV); return SSH_ERR_INTERNAL_ERROR; @@ -52,7 +52,7 @@ sshbuf_check_sanity(const struct sshbuf *buf) static void sshbuf_maybe_pack(struct sshbuf *buf, int force) { - SSHBUF_DBG("force %d", force); + SSHBUF_DBG(("force %d", force)); SSHBUF_TELL("pre-pack"); if (buf->off == 0 || buf->readonly || buf->refcount > 1) return; @@ -223,7 +223,7 @@ sshbuf_set_max_size(struct sshbuf *buf, size_t max_size) u_char *dp; int r; - SSHBUF_DBG("set max buf = %p len = %zu", buf, max_size); + SSHBUF_DBG(("set max buf = %p len = %zu", buf, max_size)); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (max_size == buf->max_size) @@ -241,7 +241,7 @@ sshbuf_set_max_size(struct sshbuf *buf, size_t max_size) rlen = ROUNDUP(buf->size, SSHBUF_SIZE_INC); if (rlen > max_size) rlen = max_size; - SSHBUF_DBG("new alloc = %zu", rlen); + SSHBUF_DBG(("new alloc = %zu", rlen)); if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) return SSH_ERR_ALLOC_FAIL; buf->cd = buf->d = dp; @@ -309,7 +309,7 @@ sshbuf_allocate(struct sshbuf *buf, size_t len) u_char *dp; int r; - SSHBUF_DBG("allocate buf = %p len = %zu", buf, len); + SSHBUF_DBG(("allocate buf = %p len = %zu", buf, len)); if ((r = sshbuf_check_reserve(buf, len)) != 0) return r; /* @@ -327,12 +327,12 @@ sshbuf_allocate(struct sshbuf *buf, size_t len) */ need = len + buf->size - buf->alloc; rlen = ROUNDUP(buf->alloc + need, SSHBUF_SIZE_INC); - SSHBUF_DBG("need %zu initial rlen %zu", need, rlen); + SSHBUF_DBG(("need %zu initial rlen %zu", need, rlen)); if (rlen > buf->max_size) rlen = buf->alloc + need; - SSHBUF_DBG("adjusted rlen %zu", rlen); + SSHBUF_DBG(("adjusted rlen %zu", rlen)); if ((dp = recallocarray(buf->d, buf->alloc, rlen, 1)) == NULL) { - SSHBUF_DBG("realloc fail"); + SSHBUF_DBG(("realloc fail")); return SSH_ERR_ALLOC_FAIL; } buf->alloc = rlen; @@ -354,7 +354,7 @@ sshbuf_reserve(struct sshbuf *buf, size_t len, u_char **dpp) if (dpp != NULL) *dpp = NULL; - SSHBUF_DBG("reserve buf = %p len = %zu", buf, len); + SSHBUF_DBG(("reserve buf = %p len = %zu", buf, len)); if ((r = sshbuf_allocate(buf, len)) != 0) return r; @@ -370,7 +370,7 @@ sshbuf_consume(struct sshbuf *buf, size_t len) { int r; - SSHBUF_DBG("len = %zu", len); + SSHBUF_DBG(("len = %zu", len)); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (len == 0) @@ -390,7 +390,7 @@ sshbuf_consume_end(struct sshbuf *buf, size_t len) { int r; - SSHBUF_DBG("len = %zu", len); + SSHBUF_DBG(("len = %zu", len)); if ((r = sshbuf_check_sanity(buf)) != 0) return r; if (len == 0) diff --git a/sshbuf.h b/sshbuf.h index 935302033..feb91f762 100644 --- a/sshbuf.h +++ b/sshbuf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.26 2022/05/25 00:31:13 djm Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.27 2022/05/25 06:03:44 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -395,17 +395,16 @@ u_int sshbuf_refcount(const struct sshbuf *buf); # ifdef SSHBUF_DEBUG # define SSHBUF_TELL(what) do { \ - fprintf(stderr, \ - "%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ + printf("%s:%d %s: %s size %zu alloc %zu off %zu max %zu\n", \ __FILE__, __LINE__, __func__, what, \ buf->size, buf->alloc, buf->off, buf->max_size); \ - fflush(stderr); \ + fflush(stdout); \ } while (0) -# define SSHBUF_DBG(...) do { \ - fprintf(stderr, "%s:%d %s: ", __FILE__, __LINE__, __func__); \ - fprintf(stderr, __VA_ARGS__); \ - fprintf(stderr, "\n"); \ - fflush(stderr); \ +# define SSHBUF_DBG(x) do { \ + printf("%s:%d %s: ", __FILE__, __LINE__, __func__); \ + printf x; \ + printf("\n"); \ + fflush(stdout); \ } while (0) # else # define SSHBUF_TELL(what) From 533b31cd08e4b97f455466f91c36915e2924c15a Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 27 May 2022 04:13:24 +0000 Subject: [PATCH 112/287] upstream: Note that ProxyJump also accepts the same tokens as ProxyCommand. From pallxk via github PR#305. OpenBSD-Commit-ID: 7115ac351b129205f1f1ffa6bbfd62abd76be7c5 --- ssh_config.5 | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index 59ff96465..052cc5c15 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.371 2022/03/31 17:58:44 naddy Exp $ -.Dd $Mdocdate: March 31 2022 $ +.\" $OpenBSD: ssh_config.5,v 1.372 2022/05/27 04:13:24 dtucker Exp $ +.Dd $Mdocdate: May 27 2022 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -2123,7 +2123,9 @@ accepts the tokens %% and %h. accepts all tokens. .Pp .Cm ProxyCommand -accepts the tokens %%, %h, %n, %p, and %r. +and +.Cm ProxyJump +accept the tokens %%, %h, %n, %p, and %r. .Sh ENVIRONMENT VARIABLES Arguments to some keywords can be expanded at runtime from environment variables on the client by enclosing them in From 5d3a77f4c5ae774c6796387266503f52c7cdc7c2 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 27 May 2022 04:27:49 +0000 Subject: [PATCH 113/287] upstream: Avoid kill with -1 argument. The out_ctx label can be reached before fork has been called. If this happens, then kill -1 would be called, sending SIGTERM to all processes reachable by the current process. From tobias@ and c3h2_ctf via github PR#286, ok djm@ OpenBSD-Commit-ID: 6277af1207d81202f5daffdccfeeaed4c763b1a8 --- readpass.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/readpass.c b/readpass.c index 39af25c88..b52f3d6b1 100644 --- a/readpass.c +++ b/readpass.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readpass.c,v 1.69 2021/07/23 05:56:47 djm Exp $ */ +/* $OpenBSD: readpass.c,v 1.70 2022/05/27 04:27:49 dtucker Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * @@ -286,7 +286,8 @@ notify_start(int force_askpass, const char *fmt, ...) } out_ctx: if ((ret = calloc(1, sizeof(*ret))) == NULL) { - kill(pid, SIGTERM); + if (pid != -1) + kill(pid, SIGTERM); fatal_f("calloc failed"); } ret->pid = pid; From 2c334fd36f80cb91cc42e4b978b10aa35e0df236 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 27 May 2022 04:29:40 +0000 Subject: [PATCH 114/287] upstream: f sshpkt functions fail, then password is not cleared with freezero. Unconditionally call freezero to guarantee that password is removed from RAM. From tobias@ and c3h2_ctf via github PR#286, ok djm@ OpenBSD-Commit-ID: 6b093619c9515328e25b0f8093779c52402c89cd --- auth2-passwd.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/auth2-passwd.c b/auth2-passwd.c index f8a6dbc19..cc12cfbc1 100644 --- a/auth2-passwd.c +++ b/auth2-passwd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-passwd.c,v 1.20 2021/12/19 22:12:07 djm Exp $ */ +/* $OpenBSD: auth2-passwd.c,v 1.21 2022/05/27 04:29:40 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -51,16 +51,18 @@ extern ServerOptions options; static int userauth_passwd(struct ssh *ssh, const char *method) { - char *password; + char *password = NULL; int authenticated = 0, r; u_char change; - size_t len; + size_t len = 0; if ((r = sshpkt_get_u8(ssh, &change)) != 0 || (r = sshpkt_get_cstring(ssh, &password, &len)) != 0 || (change && (r = sshpkt_get_cstring(ssh, NULL, NULL)) != 0) || - (r = sshpkt_get_end(ssh)) != 0) + (r = sshpkt_get_end(ssh)) != 0) { + freezero(password, len); fatal_fr(r, "parse packet"); + } if (change) logit("password change not supported"); From 3b0b142d2a0767d8cd838e2f3aefde8a0aaa41e1 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 27 May 2022 05:01:25 +0000 Subject: [PATCH 115/287] upstream: refactor authorized_keys/principals handling remove "struct ssh *" from arguments - this was only used to pass the remote host/address. These can be passed in instead and the resulting code is less tightly coupled to ssh_api.[ch] ok dtucker@ OpenBSD-Commit-ID: 9d4373d013edc4cc4b5c21a599e1837ac31dda0d --- auth.c | 10 +++--- auth.h | 10 +++--- auth2-pubkey.c | 92 ++++++++++++++++++++++++++++++-------------------- monitor.c | 9 +++-- monitor_wrap.c | 7 ++-- monitor_wrap.h | 6 ++-- 6 files changed, 77 insertions(+), 57 deletions(-) diff --git a/auth.c b/auth.c index 5809c0b0d..57ade8db7 100644 --- a/auth.c +++ b/auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.c,v 1.155 2022/04/26 07:41:44 dtucker Exp $ */ +/* $OpenBSD: auth.c,v 1.156 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -914,12 +914,10 @@ auth_restrict_session(struct ssh *ssh) } int -auth_authorise_keyopts(struct ssh *ssh, struct passwd *pw, - struct sshauthopt *opts, int allow_cert_authority, const char *loc) +auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *opts, + int allow_cert_authority, const char *remote_ip, const char *remote_host, + const char *loc) { - const char *remote_ip = ssh_remote_ipaddr(ssh); - const char *remote_host = auth_get_canonical_hostname(ssh, - options.use_dns); time_t now = time(NULL); char buf[64]; diff --git a/auth.h b/auth.h index a65d8fd02..a52ba7c2d 100644 --- a/auth.h +++ b/auth.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.102 2021/12/19 22:12:07 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.103 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -133,8 +133,8 @@ int auth_password(struct ssh *, const char *); int hostbased_key_allowed(struct ssh *, struct passwd *, const char *, char *, struct sshkey *); -int user_key_allowed(struct ssh *, struct passwd *, struct sshkey *, int, - struct sshauthopt **); +int user_key_allowed(struct passwd *, struct sshkey *, int, + const char *, const char *, struct sshauthopt **); int auth2_key_already_used(Authctxt *, const struct sshkey *); /* @@ -214,8 +214,8 @@ int sshd_hostkey_sign(struct ssh *, struct sshkey *, struct sshkey *, const struct sshauthopt *auth_options(struct ssh *); int auth_activate_options(struct ssh *, struct sshauthopt *); void auth_restrict_session(struct ssh *); -int auth_authorise_keyopts(struct ssh *, struct passwd *pw, - struct sshauthopt *, int, const char *); +int auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *, int, + const char *, const char *, const char *); void auth_log_authopts(const char *, const struct sshauthopt *, int); /* debug messages during authentication */ diff --git a/auth2-pubkey.c b/auth2-pubkey.c index d297a5c3d..2f58a138c 100644 --- a/auth2-pubkey.c +++ b/auth2-pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.113 2022/02/27 01:33:59 naddy Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.114 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -100,6 +100,9 @@ userauth_pubkey(struct ssh *ssh, const char *method) int req_presence = 0, req_verify = 0, authenticated = 0; struct sshauthopt *authopts = NULL; struct sshkey_sig_details *sig_details = NULL; + const char *remote_ip = ssh_remote_ipaddr(ssh); + const char *remote_host = auth_get_canonical_hostname(ssh, + options.use_dns); hostbound = strcmp(method, "publickey-hostbound-v00@openssh.com") == 0; @@ -222,7 +225,8 @@ userauth_pubkey(struct ssh *ssh, const char *method) #endif /* test for correct signature */ authenticated = 0; - if (PRIVSEP(user_key_allowed(ssh, pw, key, 1, &authopts)) && + if (PRIVSEP(user_key_allowed(pw, key, 1, remote_ip, + remote_host, &authopts)) && PRIVSEP(sshkey_verify(key, sig, slen, sshbuf_ptr(b), sshbuf_len(b), (ssh->compat & SSH_BUG_SIGTYPE) == 0 ? pkalg : NULL, @@ -284,7 +288,8 @@ userauth_pubkey(struct ssh *ssh, const char *method) * if a user is not allowed to login. is this an * issue? -markus */ - if (PRIVSEP(user_key_allowed(ssh, pw, key, 0, NULL))) { + if (PRIVSEP(user_key_allowed(pw, key, 0, remote_ip, + remote_host, NULL))) { if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_PK_OK)) != 0 || (r = sshpkt_put_cstring(ssh, pkalg)) != 0 || @@ -342,7 +347,7 @@ match_principals_option(const char *principal_list, struct sshkey_cert *cert) * log preamble for file/line information. */ static int -check_principals_line(struct ssh *ssh, char *cp, const struct sshkey_cert *cert, +check_principals_line(char *cp, const struct sshkey_cert *cert, const char *loc, struct sshauthopt **authoptsp) { u_int i, found = 0; @@ -392,7 +397,7 @@ check_principals_line(struct ssh *ssh, char *cp, const struct sshkey_cert *cert, } static int -process_principals(struct ssh *ssh, FILE *f, const char *file, +process_principals(FILE *f, const char *file, const struct sshkey_cert *cert, struct sshauthopt **authoptsp) { char loc[256], *line = NULL, *cp, *ep; @@ -420,7 +425,7 @@ process_principals(struct ssh *ssh, FILE *f, const char *file, nonblank++; snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); - if (check_principals_line(ssh, cp, cert, loc, authoptsp) == 0) + if (check_principals_line(cp, cert, loc, authoptsp) == 0) found_principal = 1; } debug2_f("%s: processed %lu/%lu lines", file, nonblank, linenum); @@ -431,7 +436,7 @@ process_principals(struct ssh *ssh, FILE *f, const char *file, /* XXX remove pw args here and elsewhere once ssh->authctxt is guaranteed */ static int -match_principals_file(struct ssh *ssh, struct passwd *pw, char *file, +match_principals_file(struct passwd *pw, char *file, struct sshkey_cert *cert, struct sshauthopt **authoptsp) { FILE *f; @@ -446,7 +451,7 @@ match_principals_file(struct ssh *ssh, struct passwd *pw, char *file, restore_uid(); return 0; } - success = process_principals(ssh, f, file, cert, authoptsp); + success = process_principals(f, file, cert, authoptsp); fclose(f); restore_uid(); return success; @@ -457,7 +462,7 @@ match_principals_file(struct ssh *ssh, struct passwd *pw, char *file, * returns 1 if the principal is allowed or 0 otherwise. */ static int -match_principals_command(struct ssh *ssh, struct passwd *user_pw, +match_principals_command(struct passwd *user_pw, const struct sshkey *key, struct sshauthopt **authoptsp) { struct passwd *runas_pw = NULL; @@ -562,7 +567,7 @@ match_principals_command(struct ssh *ssh, struct passwd *user_pw, uid_swapped = 1; temporarily_use_uid(runas_pw); - ok = process_principals(ssh, f, "(command)", cert, authoptsp); + ok = process_principals(f, "(command)", cert, authoptsp); fclose(f); f = NULL; @@ -596,8 +601,9 @@ match_principals_command(struct ssh *ssh, struct passwd *user_pw, * on success. "loc" is used as file/line location in log messages. */ static int -check_authkey_line(struct ssh *ssh, struct passwd *pw, struct sshkey *key, - char *cp, const char *loc, struct sshauthopt **authoptsp) +check_authkey_line(struct passwd *pw, struct sshkey *key, + char *cp, const char *remote_ip, const char *remote_host, const char *loc, + struct sshauthopt **authoptsp) { int want_keytype = sshkey_is_cert(key) ? KEY_UNSPEC : key->type; struct sshkey *found = NULL; @@ -657,8 +663,8 @@ check_authkey_line(struct ssh *ssh, struct passwd *pw, struct sshkey *key, debug("%s: matching %s found: %s %s", loc, sshkey_is_cert(key) ? "CA" : "key", sshkey_type(found), fp); - if (auth_authorise_keyopts(ssh, pw, keyopts, - sshkey_is_cert(key), loc) != 0) { + if (auth_authorise_keyopts(pw, keyopts, + sshkey_is_cert(key), remote_ip, remote_host, loc) != 0) { reason = "Refused by key options"; goto fail_reason; } @@ -680,7 +686,8 @@ check_authkey_line(struct ssh *ssh, struct passwd *pw, struct sshkey *key, reason = "Invalid certificate options"; goto fail_reason; } - if (auth_authorise_keyopts(ssh, pw, certopts, 0, loc) != 0) { + if (auth_authorise_keyopts(pw, certopts, 0, + remote_ip, remote_host, loc) != 0) { reason = "Refused by certificate options"; goto fail_reason; } @@ -736,8 +743,9 @@ check_authkey_line(struct ssh *ssh, struct passwd *pw, struct sshkey *key, * returns 1 if the key is allowed or 0 otherwise. */ static int -check_authkeys_file(struct ssh *ssh, struct passwd *pw, FILE *f, - char *file, struct sshkey *key, struct sshauthopt **authoptsp) +check_authkeys_file(struct passwd *pw, FILE *f, char *file, + struct sshkey *key, const char *remote_ip, + const char *remote_host, struct sshauthopt **authoptsp) { char *cp, *line = NULL, loc[256]; size_t linesize = 0; @@ -761,7 +769,8 @@ check_authkeys_file(struct ssh *ssh, struct passwd *pw, FILE *f, nonblank++; snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); - if (check_authkey_line(ssh, pw, key, cp, loc, authoptsp) == 0) + if (check_authkey_line(pw, key, cp, + remote_ip, remote_host, loc, authoptsp) == 0) found_key = 1; } free(line); @@ -771,7 +780,8 @@ check_authkeys_file(struct ssh *ssh, struct passwd *pw, FILE *f, /* Authenticate a certificate key against TrustedUserCAKeys */ static int -user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key, +user_cert_trusted_ca(struct passwd *pw, struct sshkey *key, + const char *remote_ip, const char *remote_host, struct sshauthopt **authoptsp) { char *ca_fp, *principals_file = NULL; @@ -803,12 +813,12 @@ user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key, * against the username. */ if ((principals_file = authorized_principals_file(pw)) != NULL) { - if (match_principals_file(ssh, pw, principals_file, + if (match_principals_file(pw, principals_file, key->cert, &principals_opts)) found_principal = 1; } /* Try querying command if specified */ - if (!found_principal && match_principals_command(ssh, pw, key, + if (!found_principal && match_principals_command(pw, key, &principals_opts)) found_principal = 1; /* If principals file or command is specified, then require a match */ @@ -829,7 +839,8 @@ user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key, reason = "Invalid certificate options"; goto fail_reason; } - if (auth_authorise_keyopts(ssh, pw, cert_opts, 0, "cert") != 0) { + if (auth_authorise_keyopts(pw, cert_opts, 0, + remote_ip, remote_host, "cert") != 0) { reason = "Refused by certificate options"; goto fail_reason; } @@ -837,8 +848,8 @@ user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key, final_opts = cert_opts; cert_opts = NULL; } else { - if (auth_authorise_keyopts(ssh, pw, principals_opts, 0, - "principals") != 0) { + if (auth_authorise_keyopts(pw, principals_opts, 0, + remote_ip, remote_host, "principals") != 0) { reason = "Refused by certificate principals options"; goto fail_reason; } @@ -876,8 +887,9 @@ user_cert_trusted_ca(struct ssh *ssh, struct passwd *pw, struct sshkey *key, * returns 1 if the key is allowed or 0 otherwise. */ static int -user_key_allowed2(struct ssh *ssh, struct passwd *pw, struct sshkey *key, - char *file, struct sshauthopt **authoptsp) +user_key_allowed2(struct passwd *pw, struct sshkey *key, + char *file, const char *remote_ip, const char *remote_host, + struct sshauthopt **authoptsp) { FILE *f; int found_key = 0; @@ -890,8 +902,8 @@ user_key_allowed2(struct ssh *ssh, struct passwd *pw, struct sshkey *key, debug("trying public key file %s", file); if ((f = auth_openkeyfile(file, pw, options.strict_modes)) != NULL) { - found_key = check_authkeys_file(ssh, pw, f, file, - key, authoptsp); + found_key = check_authkeys_file(pw, f, file, + key, remote_ip, remote_host, authoptsp); fclose(f); } @@ -904,8 +916,9 @@ user_key_allowed2(struct ssh *ssh, struct passwd *pw, struct sshkey *key, * returns 1 if the key is allowed or 0 otherwise. */ static int -user_key_command_allowed2(struct ssh *ssh, struct passwd *user_pw, - struct sshkey *key, struct sshauthopt **authoptsp) +user_key_command_allowed2(struct passwd *user_pw, struct sshkey *key, + const char *remote_ip, const char *remote_host, + struct sshauthopt **authoptsp) { struct passwd *runas_pw = NULL; FILE *f = NULL; @@ -1005,8 +1018,9 @@ user_key_command_allowed2(struct ssh *ssh, struct passwd *user_pw, uid_swapped = 1; temporarily_use_uid(runas_pw); - ok = check_authkeys_file(ssh, user_pw, f, - options.authorized_keys_command, key, authoptsp); + ok = check_authkeys_file(user_pw, f, + options.authorized_keys_command, key, remote_ip, + remote_host, authoptsp); fclose(f); f = NULL; @@ -1036,8 +1050,9 @@ user_key_command_allowed2(struct ssh *ssh, struct passwd *user_pw, * Check whether key authenticates and authorises the user. */ int -user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, - int auth_attempt, struct sshauthopt **authoptsp) +user_key_allowed(struct passwd *pw, struct sshkey *key, + int auth_attempt, const char *remote_ip, const char *remote_host, + struct sshauthopt **authoptsp) { u_int success = 0, i; char *file; @@ -1057,7 +1072,8 @@ user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, continue; file = expand_authorized_keys( options.authorized_keys_files[i], pw); - success = user_key_allowed2(ssh, pw, key, file, &opts); + success = user_key_allowed2(pw, key, file, + remote_ip, remote_host, &opts); free(file); if (!success) { sshauthopt_free(opts); @@ -1067,12 +1083,14 @@ user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, if (success) goto out; - if ((success = user_cert_trusted_ca(ssh, pw, key, &opts)) != 0) + if ((success = user_cert_trusted_ca(pw, key, remote_ip, remote_host, + &opts)) != 0) goto out; sshauthopt_free(opts); opts = NULL; - if ((success = user_key_command_allowed2(ssh, pw, key, &opts)) != 0) + if ((success = user_key_command_allowed2(pw, key, remote_ip, + remote_host, &opts)) != 0) goto out; sshauthopt_free(opts); opts = NULL; diff --git a/monitor.c b/monitor.c index 20b9f67b9..022126094 100644 --- a/monitor.c +++ b/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.232 2022/02/25 02:09:27 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.233 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -1151,6 +1151,9 @@ mm_answer_keyallowed(struct ssh *ssh, int sock, struct sshbuf *m) u_int type = 0; int r, allowed = 0; struct sshauthopt *opts = NULL; + const char *remote_ip = ssh_remote_ipaddr(ssh); + const char *remote_host = auth_get_canonical_hostname(ssh, + options.use_dns); debug3_f("entering"); if ((r = sshbuf_get_u32(m, &type)) != 0 || @@ -1176,8 +1179,8 @@ mm_answer_keyallowed(struct ssh *ssh, int sock, struct sshbuf *m) if (!key_base_type_match(auth_method, key, options.pubkey_accepted_algos)) break; - allowed = user_key_allowed(ssh, authctxt->pw, key, - pubkey_auth_attempt, &opts); + allowed = user_key_allowed(authctxt->pw, key, + pubkey_auth_attempt, remote_ip, remote_host, &opts); break; case MM_HOSTKEY: auth_method = "hostbased"; diff --git a/monitor_wrap.c b/monitor_wrap.c index 748333c75..925985a83 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.c,v 1.123 2021/04/15 16:24:31 markus Exp $ */ +/* $OpenBSD: monitor_wrap.c,v 1.124 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -434,8 +434,9 @@ mm_auth_password(struct ssh *ssh, char *password) } int -mm_user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, - int pubkey_auth_attempt, struct sshauthopt **authoptp) +mm_user_key_allowed(struct passwd *pw, struct sshkey *key, + int pubkey_auth_attempt, const char *remote_ip, const char *remote_host, + struct sshauthopt **authoptp) { return (mm_key_allowed(MM_USERKEY, NULL, NULL, key, pubkey_auth_attempt, authoptp)); diff --git a/monitor_wrap.h b/monitor_wrap.h index a163b67d2..c5a75b9a3 100644 --- a/monitor_wrap.h +++ b/monitor_wrap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.h,v 1.47 2021/04/15 16:24:31 markus Exp $ */ +/* $OpenBSD: monitor_wrap.h,v 1.48 2022/05/27 05:01:25 djm Exp $ */ /* * Copyright 2002 Niels Provos @@ -54,8 +54,8 @@ char *mm_auth2_read_banner(void); int mm_auth_password(struct ssh *, char *); int mm_key_allowed(enum mm_keytype, const char *, const char *, struct sshkey *, int, struct sshauthopt **); -int mm_user_key_allowed(struct ssh *, struct passwd *, struct sshkey *, int, - struct sshauthopt **); +int mm_user_key_allowed(struct passwd *, struct sshkey *, int, + const char *, const char *, struct sshauthopt **); int mm_hostbased_key_allowed(struct ssh *, struct passwd *, const char *, const char *, struct sshkey *); int mm_sshkey_verify(const struct sshkey *, const u_char *, size_t, From c83d8c4d6f3ccceef84d46de107f6b71cda06359 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 27 May 2022 05:02:46 +0000 Subject: [PATCH 116/287] upstream: split the low-level file handling functions out from auth2-pubkey.c Put them in a new auth2-pubkeyfile.c to make it easier to refer to them (e.g. in unit/fuzz tests) without having to refer to everything else pubkey auth brings in. ok dtucker@ OpenBSD-Commit-ID: 3fdca2c61ad97dc1b8d4a7346816f83dc4ce2217 --- Makefile.in | 2 +- auth.c | 94 +--------- auth.h | 18 +- auth2-pubkey.c | 311 +------------------------------ auth2-pubkeyfile.c | 442 +++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 465 insertions(+), 402 deletions(-) create mode 100644 auth2-pubkeyfile.c diff --git a/Makefile.in b/Makefile.in index 7250d3f31..3c2856829 100644 --- a/Makefile.in +++ b/Makefile.in @@ -123,7 +123,7 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o \ auth.o auth2.o auth-options.o session.o \ auth2-chall.o groupaccess.o \ auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \ - auth2-none.o auth2-passwd.o auth2-pubkey.o \ + auth2-none.o auth2-passwd.o auth2-pubkey.o auth2-pubkeyfile.o \ monitor.o monitor_wrap.o auth-krb5.o \ auth2-gss.o gss-serv.o gss-serv-krb5.o \ loginrec.o auth-pam.o auth-shadow.o auth-sia.o \ diff --git a/auth.c b/auth.c index 57ade8db7..9ad9034aa 100644 --- a/auth.c +++ b/auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.c,v 1.156 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: auth.c,v 1.157 2022/05/27 05:02:46 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -912,95 +912,3 @@ auth_restrict_session(struct ssh *ssh) fatal_f("failed to restrict session"); sshauthopt_free(restricted); } - -int -auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *opts, - int allow_cert_authority, const char *remote_ip, const char *remote_host, - const char *loc) -{ - time_t now = time(NULL); - char buf[64]; - - /* - * Check keys/principals file expiry time. - * NB. validity interval in certificate is handled elsewhere. - */ - if (opts->valid_before && now > 0 && - opts->valid_before < (uint64_t)now) { - format_absolute_time(opts->valid_before, buf, sizeof(buf)); - debug("%s: entry expired at %s", loc, buf); - auth_debug_add("%s: entry expired at %s", loc, buf); - return -1; - } - /* Consistency checks */ - if (opts->cert_principals != NULL && !opts->cert_authority) { - debug("%s: principals on non-CA key", loc); - auth_debug_add("%s: principals on non-CA key", loc); - /* deny access */ - return -1; - } - /* cert-authority flag isn't valid in authorized_principals files */ - if (!allow_cert_authority && opts->cert_authority) { - debug("%s: cert-authority flag invalid here", loc); - auth_debug_add("%s: cert-authority flag invalid here", loc); - /* deny access */ - return -1; - } - - /* Perform from= checks */ - if (opts->required_from_host_keys != NULL) { - switch (match_host_and_ip(remote_host, remote_ip, - opts->required_from_host_keys )) { - case 1: - /* Host name matches. */ - break; - case -1: - default: - debug("%s: invalid from criteria", loc); - auth_debug_add("%s: invalid from criteria", loc); - /* FALLTHROUGH */ - case 0: - logit("%s: Authentication tried for %.100s with " - "correct key but not from a permitted " - "host (host=%.200s, ip=%.200s, required=%.200s).", - loc, pw->pw_name, remote_host, remote_ip, - opts->required_from_host_keys); - auth_debug_add("%s: Your host '%.200s' is not " - "permitted to use this key for login.", - loc, remote_host); - /* deny access */ - return -1; - } - } - /* Check source-address restriction from certificate */ - if (opts->required_from_host_cert != NULL) { - switch (addr_match_cidr_list(remote_ip, - opts->required_from_host_cert)) { - case 1: - /* accepted */ - break; - case -1: - default: - /* invalid */ - error("%s: Certificate source-address invalid", loc); - /* FALLTHROUGH */ - case 0: - logit("%s: Authentication tried for %.100s with valid " - "certificate but not from a permitted source " - "address (%.200s).", loc, pw->pw_name, remote_ip); - auth_debug_add("%s: Your address '%.200s' is not " - "permitted to use this certificate for login.", - loc, remote_ip); - return -1; - } - } - /* - * - * XXX this is spammy. We should report remotely only for keys - * that are successful in actual auth attempts, and not PK_OK - * tests. - */ - auth_log_authopts(loc, opts, 1); - - return 0; -} diff --git a/auth.h b/auth.h index a52ba7c2d..b8eec4a6a 100644 --- a/auth.h +++ b/auth.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.103 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.104 2022/05/27 05:02:46 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -29,6 +29,7 @@ #define AUTH_H #include +#include #ifdef HAVE_LOGIN_CAP #include @@ -44,6 +45,7 @@ struct passwd; struct ssh; struct sshbuf; struct sshkey; +struct sshkey_cert; struct sshauthopt; typedef struct Authctxt Authctxt; @@ -214,8 +216,6 @@ int sshd_hostkey_sign(struct ssh *, struct sshkey *, struct sshkey *, const struct sshauthopt *auth_options(struct ssh *); int auth_activate_options(struct ssh *, struct sshauthopt *); void auth_restrict_session(struct ssh *); -int auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *, int, - const char *, const char *, const char *); void auth_log_authopts(const char *, const struct sshauthopt *, int); /* debug messages during authentication */ @@ -226,6 +226,18 @@ void auth_debug_reset(void); struct passwd *fakepw(void); +/* auth2-pubkeyfile.c */ +int auth_authorise_keyopts(struct passwd *, struct sshauthopt *, int, + const char *, const char *, const char *); +int auth_check_principals_line(char *, const struct sshkey_cert *, + const char *, struct sshauthopt **); +int auth_process_principals(FILE *, const char *, + const struct sshkey_cert *, struct sshauthopt **); +int auth_check_authkey_line(struct passwd *, struct sshkey *, + char *, const char *, const char *, const char *, struct sshauthopt **); +int auth_check_authkeys_file(struct passwd *, FILE *, char *, + struct sshkey *, const char *, const char *, struct sshauthopt **); + int sys_auth_passwd(struct ssh *, const char *); #if defined(KRB5) && !defined(HEIMDAL) diff --git a/auth2-pubkey.c b/auth2-pubkey.c index 2f58a138c..952af119e 100644 --- a/auth2-pubkey.c +++ b/auth2-pubkey.c @@ -1,6 +1,7 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.114 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.115 2022/05/27 05:02:46 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. + * Copyright (c) 2010 Damien Miller. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,11 +27,9 @@ #include "includes.h" #include -#include #include #include -#include #ifdef HAVE_PATHS_H # include #endif @@ -67,7 +66,6 @@ #include "authfile.h" #include "match.h" #include "ssherr.h" -#include "kex.h" #include "channels.h" /* XXX for session.h */ #include "session.h" /* XXX for child_set_env(); refactor? */ #include "sk-api.h" @@ -321,120 +319,6 @@ done: return authenticated; } -static int -match_principals_option(const char *principal_list, struct sshkey_cert *cert) -{ - char *result; - u_int i; - - /* XXX percent_expand() sequences for authorized_principals? */ - - for (i = 0; i < cert->nprincipals; i++) { - if ((result = match_list(cert->principals[i], - principal_list, NULL)) != NULL) { - debug3("matched principal from key options \"%.100s\"", - result); - free(result); - return 1; - } - } - return 0; -} - -/* - * Process a single authorized_principals format line. Returns 0 and sets - * authoptsp is principal is authorised, -1 otherwise. "loc" is used as a - * log preamble for file/line information. - */ -static int -check_principals_line(char *cp, const struct sshkey_cert *cert, - const char *loc, struct sshauthopt **authoptsp) -{ - u_int i, found = 0; - char *ep, *line_opts; - const char *reason = NULL; - struct sshauthopt *opts = NULL; - - if (authoptsp != NULL) - *authoptsp = NULL; - - /* Trim trailing whitespace. */ - ep = cp + strlen(cp) - 1; - while (ep > cp && (*ep == '\n' || *ep == ' ' || *ep == '\t')) - *ep-- = '\0'; - - /* - * If the line has internal whitespace then assume it has - * key options. - */ - line_opts = NULL; - if ((ep = strrchr(cp, ' ')) != NULL || - (ep = strrchr(cp, '\t')) != NULL) { - for (; *ep == ' ' || *ep == '\t'; ep++) - ; - line_opts = cp; - cp = ep; - } - if ((opts = sshauthopt_parse(line_opts, &reason)) == NULL) { - debug("%s: bad principals options: %s", loc, reason); - auth_debug_add("%s: bad principals options: %s", loc, reason); - return -1; - } - /* Check principals in cert against those on line */ - for (i = 0; i < cert->nprincipals; i++) { - if (strcmp(cp, cert->principals[i]) != 0) - continue; - debug3("%s: matched principal \"%.100s\"", - loc, cert->principals[i]); - found = 1; - } - if (found && authoptsp != NULL) { - *authoptsp = opts; - opts = NULL; - } - sshauthopt_free(opts); - return found ? 0 : -1; -} - -static int -process_principals(FILE *f, const char *file, - const struct sshkey_cert *cert, struct sshauthopt **authoptsp) -{ - char loc[256], *line = NULL, *cp, *ep; - size_t linesize = 0; - u_long linenum = 0, nonblank = 0; - u_int found_principal = 0; - - if (authoptsp != NULL) - *authoptsp = NULL; - - while (getline(&line, &linesize, f) != -1) { - linenum++; - /* Always consume entire input */ - if (found_principal) - continue; - - /* Skip leading whitespace. */ - for (cp = line; *cp == ' ' || *cp == '\t'; cp++) - ; - /* Skip blank and comment lines. */ - if ((ep = strchr(cp, '#')) != NULL) - *ep = '\0'; - if (!*cp || *cp == '\n') - continue; - - nonblank++; - snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); - if (check_principals_line(cp, cert, loc, authoptsp) == 0) - found_principal = 1; - } - debug2_f("%s: processed %lu/%lu lines", file, nonblank, linenum); - free(line); - return found_principal; -} - -/* XXX remove pw args here and elsewhere once ssh->authctxt is guaranteed */ - static int match_principals_file(struct passwd *pw, char *file, struct sshkey_cert *cert, struct sshauthopt **authoptsp) @@ -451,7 +335,7 @@ match_principals_file(struct passwd *pw, char *file, restore_uid(); return 0; } - success = process_principals(f, file, cert, authoptsp); + success = auth_process_principals(f, file, cert, authoptsp); fclose(f); restore_uid(); return success; @@ -567,7 +451,7 @@ match_principals_command(struct passwd *user_pw, uid_swapped = 1; temporarily_use_uid(runas_pw); - ok = process_principals(f, "(command)", cert, authoptsp); + ok = auth_process_principals(f, "(command)", cert, authoptsp); fclose(f); f = NULL; @@ -595,189 +479,6 @@ match_principals_command(struct passwd *user_pw, return found_principal; } -/* - * Check a single line of an authorized_keys-format file. Returns 0 if key - * matches, -1 otherwise. Will return key/cert options via *authoptsp - * on success. "loc" is used as file/line location in log messages. - */ -static int -check_authkey_line(struct passwd *pw, struct sshkey *key, - char *cp, const char *remote_ip, const char *remote_host, const char *loc, - struct sshauthopt **authoptsp) -{ - int want_keytype = sshkey_is_cert(key) ? KEY_UNSPEC : key->type; - struct sshkey *found = NULL; - struct sshauthopt *keyopts = NULL, *certopts = NULL, *finalopts = NULL; - char *key_options = NULL, *fp = NULL; - const char *reason = NULL; - int ret = -1; - - if (authoptsp != NULL) - *authoptsp = NULL; - - if ((found = sshkey_new(want_keytype)) == NULL) { - debug3_f("keytype %d failed", want_keytype); - goto out; - } - - /* XXX djm: peek at key type in line and skip if unwanted */ - - if (sshkey_read(found, &cp) != 0) { - /* no key? check for options */ - debug2("%s: check options: '%s'", loc, cp); - key_options = cp; - if (sshkey_advance_past_options(&cp) != 0) { - reason = "invalid key option string"; - goto fail_reason; - } - skip_space(&cp); - if (sshkey_read(found, &cp) != 0) { - /* still no key? advance to next line*/ - debug2("%s: advance: '%s'", loc, cp); - goto out; - } - } - /* Parse key options now; we need to know if this is a CA key */ - if ((keyopts = sshauthopt_parse(key_options, &reason)) == NULL) { - debug("%s: bad key options: %s", loc, reason); - auth_debug_add("%s: bad key options: %s", loc, reason); - goto out; - } - /* Ignore keys that don't match or incorrectly marked as CAs */ - if (sshkey_is_cert(key)) { - /* Certificate; check signature key against CA */ - if (!sshkey_equal(found, key->cert->signature_key) || - !keyopts->cert_authority) - goto out; - } else { - /* Plain key: check it against key found in file */ - if (!sshkey_equal(found, key) || keyopts->cert_authority) - goto out; - } - - /* We have a candidate key, perform authorisation checks */ - if ((fp = sshkey_fingerprint(found, - options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL) - fatal_f("fingerprint failed"); - - debug("%s: matching %s found: %s %s", loc, - sshkey_is_cert(key) ? "CA" : "key", sshkey_type(found), fp); - - if (auth_authorise_keyopts(pw, keyopts, - sshkey_is_cert(key), remote_ip, remote_host, loc) != 0) { - reason = "Refused by key options"; - goto fail_reason; - } - /* That's all we need for plain keys. */ - if (!sshkey_is_cert(key)) { - verbose("Accepted key %s %s found at %s", - sshkey_type(found), fp, loc); - finalopts = keyopts; - keyopts = NULL; - goto success; - } - - /* - * Additional authorisation for certificates. - */ - - /* Parse and check options present in certificate */ - if ((certopts = sshauthopt_from_cert(key)) == NULL) { - reason = "Invalid certificate options"; - goto fail_reason; - } - if (auth_authorise_keyopts(pw, certopts, 0, - remote_ip, remote_host, loc) != 0) { - reason = "Refused by certificate options"; - goto fail_reason; - } - if ((finalopts = sshauthopt_merge(keyopts, certopts, &reason)) == NULL) - goto fail_reason; - - /* - * If the user has specified a list of principals as - * a key option, then prefer that list to matching - * their username in the certificate principals list. - */ - if (keyopts->cert_principals != NULL && - !match_principals_option(keyopts->cert_principals, key->cert)) { - reason = "Certificate does not contain an authorized principal"; - goto fail_reason; - } - if (sshkey_cert_check_authority_now(key, 0, 0, 0, - keyopts->cert_principals == NULL ? pw->pw_name : NULL, - &reason) != 0) - goto fail_reason; - - verbose("Accepted certificate ID \"%s\" (serial %llu) " - "signed by CA %s %s found at %s", - key->cert->key_id, - (unsigned long long)key->cert->serial, - sshkey_type(found), fp, loc); - - success: - if (finalopts == NULL) - fatal_f("internal error: missing options"); - if (authoptsp != NULL) { - *authoptsp = finalopts; - finalopts = NULL; - } - /* success */ - ret = 0; - goto out; - - fail_reason: - error("%s", reason); - auth_debug_add("%s", reason); - out: - free(fp); - sshauthopt_free(keyopts); - sshauthopt_free(certopts); - sshauthopt_free(finalopts); - sshkey_free(found); - return ret; -} - -/* - * Checks whether key is allowed in authorized_keys-format file, - * returns 1 if the key is allowed or 0 otherwise. - */ -static int -check_authkeys_file(struct passwd *pw, FILE *f, char *file, - struct sshkey *key, const char *remote_ip, - const char *remote_host, struct sshauthopt **authoptsp) -{ - char *cp, *line = NULL, loc[256]; - size_t linesize = 0; - int found_key = 0; - u_long linenum = 0, nonblank = 0; - - if (authoptsp != NULL) - *authoptsp = NULL; - - while (getline(&line, &linesize, f) != -1) { - linenum++; - /* Always consume entire file */ - if (found_key) - continue; - - /* Skip leading whitespace, empty and comment lines. */ - cp = line; - skip_space(&cp); - if (!*cp || *cp == '\n' || *cp == '#') - continue; - - nonblank++; - snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); - if (check_authkey_line(pw, key, cp, - remote_ip, remote_host, loc, authoptsp) == 0) - found_key = 1; - } - free(line); - debug2_f("%s: processed %lu/%lu lines", file, nonblank, linenum); - return found_key; -} - /* Authenticate a certificate key against TrustedUserCAKeys */ static int user_cert_trusted_ca(struct passwd *pw, struct sshkey *key, @@ -902,7 +603,7 @@ user_key_allowed2(struct passwd *pw, struct sshkey *key, debug("trying public key file %s", file); if ((f = auth_openkeyfile(file, pw, options.strict_modes)) != NULL) { - found_key = check_authkeys_file(pw, f, file, + found_key = auth_check_authkeys_file(pw, f, file, key, remote_ip, remote_host, authoptsp); fclose(f); } @@ -1018,7 +719,7 @@ user_key_command_allowed2(struct passwd *user_pw, struct sshkey *key, uid_swapped = 1; temporarily_use_uid(runas_pw); - ok = check_authkeys_file(user_pw, f, + ok = auth_check_authkeys_file(user_pw, f, options.authorized_keys_command, key, remote_ip, remote_host, authoptsp); diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c new file mode 100644 index 000000000..a304d0953 --- /dev/null +++ b/auth2-pubkeyfile.c @@ -0,0 +1,442 @@ +/* $OpenBSD: auth2-pubkeyfile.c,v 1.1 2022/05/27 05:02:46 djm Exp $ */ +/* + * Copyright (c) 2000 Markus Friedl. All rights reserved. + * Copyright (c) 2010 Damien Miller. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "includes.h" + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ssh.h" +#include "log.h" +#include "misc.h" +#include "compat.h" +#include "sshkey.h" +#include "digest.h" +#include "hostfile.h" +#include "auth.h" +#include "auth-options.h" +#include "authfile.h" +#include "match.h" +#include "ssherr.h" + +int +auth_authorise_keyopts(struct passwd *pw, struct sshauthopt *opts, + int allow_cert_authority, const char *remote_ip, const char *remote_host, + const char *loc) +{ + time_t now = time(NULL); + char buf[64]; + + /* + * Check keys/principals file expiry time. + * NB. validity interval in certificate is handled elsewhere. + */ + if (opts->valid_before && now > 0 && + opts->valid_before < (uint64_t)now) { + format_absolute_time(opts->valid_before, buf, sizeof(buf)); + debug("%s: entry expired at %s", loc, buf); + auth_debug_add("%s: entry expired at %s", loc, buf); + return -1; + } + /* Consistency checks */ + if (opts->cert_principals != NULL && !opts->cert_authority) { + debug("%s: principals on non-CA key", loc); + auth_debug_add("%s: principals on non-CA key", loc); + /* deny access */ + return -1; + } + /* cert-authority flag isn't valid in authorized_principals files */ + if (!allow_cert_authority && opts->cert_authority) { + debug("%s: cert-authority flag invalid here", loc); + auth_debug_add("%s: cert-authority flag invalid here", loc); + /* deny access */ + return -1; + } + + /* Perform from= checks */ + if (opts->required_from_host_keys != NULL) { + switch (match_host_and_ip(remote_host, remote_ip, + opts->required_from_host_keys )) { + case 1: + /* Host name matches. */ + break; + case -1: + default: + debug("%s: invalid from criteria", loc); + auth_debug_add("%s: invalid from criteria", loc); + /* FALLTHROUGH */ + case 0: + logit("%s: Authentication tried for %.100s with " + "correct key but not from a permitted " + "host (host=%.200s, ip=%.200s, required=%.200s).", + loc, pw->pw_name, remote_host, remote_ip, + opts->required_from_host_keys); + auth_debug_add("%s: Your host '%.200s' is not " + "permitted to use this key for login.", + loc, remote_host); + /* deny access */ + return -1; + } + } + /* Check source-address restriction from certificate */ + if (opts->required_from_host_cert != NULL) { + switch (addr_match_cidr_list(remote_ip, + opts->required_from_host_cert)) { + case 1: + /* accepted */ + break; + case -1: + default: + /* invalid */ + error("%s: Certificate source-address invalid", loc); + /* FALLTHROUGH */ + case 0: + logit("%s: Authentication tried for %.100s with valid " + "certificate but not from a permitted source " + "address (%.200s).", loc, pw->pw_name, remote_ip); + auth_debug_add("%s: Your address '%.200s' is not " + "permitted to use this certificate for login.", + loc, remote_ip); + return -1; + } + } + /* + * + * XXX this is spammy. We should report remotely only for keys + * that are successful in actual auth attempts, and not PK_OK + * tests. + */ + auth_log_authopts(loc, opts, 1); + + return 0; +} + +static int +match_principals_option(const char *principal_list, struct sshkey_cert *cert) +{ + char *result; + u_int i; + + /* XXX percent_expand() sequences for authorized_principals? */ + + for (i = 0; i < cert->nprincipals; i++) { + if ((result = match_list(cert->principals[i], + principal_list, NULL)) != NULL) { + debug3("matched principal from key options \"%.100s\"", + result); + free(result); + return 1; + } + } + return 0; +} + +/* + * Process a single authorized_principals format line. Returns 0 and sets + * authoptsp is principal is authorised, -1 otherwise. "loc" is used as a + * log preamble for file/line information. + */ +int +auth_check_principals_line(char *cp, const struct sshkey_cert *cert, + const char *loc, struct sshauthopt **authoptsp) +{ + u_int i, found = 0; + char *ep, *line_opts; + const char *reason = NULL; + struct sshauthopt *opts = NULL; + + if (authoptsp != NULL) + *authoptsp = NULL; + + /* Trim trailing whitespace. */ + ep = cp + strlen(cp) - 1; + while (ep > cp && (*ep == '\n' || *ep == ' ' || *ep == '\t')) + *ep-- = '\0'; + + /* + * If the line has internal whitespace then assume it has + * key options. + */ + line_opts = NULL; + if ((ep = strrchr(cp, ' ')) != NULL || + (ep = strrchr(cp, '\t')) != NULL) { + for (; *ep == ' ' || *ep == '\t'; ep++) + ; + line_opts = cp; + cp = ep; + } + if ((opts = sshauthopt_parse(line_opts, &reason)) == NULL) { + debug("%s: bad principals options: %s", loc, reason); + auth_debug_add("%s: bad principals options: %s", loc, reason); + return -1; + } + /* Check principals in cert against those on line */ + for (i = 0; i < cert->nprincipals; i++) { + if (strcmp(cp, cert->principals[i]) != 0) + continue; + debug3("%s: matched principal \"%.100s\"", + loc, cert->principals[i]); + found = 1; + } + if (found && authoptsp != NULL) { + *authoptsp = opts; + opts = NULL; + } + sshauthopt_free(opts); + return found ? 0 : -1; +} + +int +auth_process_principals(FILE *f, const char *file, + const struct sshkey_cert *cert, struct sshauthopt **authoptsp) +{ + char loc[256], *line = NULL, *cp, *ep; + size_t linesize = 0; + u_long linenum = 0, nonblank = 0; + u_int found_principal = 0; + + if (authoptsp != NULL) + *authoptsp = NULL; + + while (getline(&line, &linesize, f) != -1) { + linenum++; + /* Always consume entire input */ + if (found_principal) + continue; + + /* Skip leading whitespace. */ + for (cp = line; *cp == ' ' || *cp == '\t'; cp++) + ; + /* Skip blank and comment lines. */ + if ((ep = strchr(cp, '#')) != NULL) + *ep = '\0'; + if (!*cp || *cp == '\n') + continue; + + nonblank++; + snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); + if (auth_check_principals_line(cp, cert, loc, authoptsp) == 0) + found_principal = 1; + } + debug2_f("%s: processed %lu/%lu lines", file, nonblank, linenum); + free(line); + return found_principal; +} + +/* + * Check a single line of an authorized_keys-format file. Returns 0 if key + * matches, -1 otherwise. Will return key/cert options via *authoptsp + * on success. "loc" is used as file/line location in log messages. + */ +int +auth_check_authkey_line(struct passwd *pw, struct sshkey *key, + char *cp, const char *remote_ip, const char *remote_host, const char *loc, + struct sshauthopt **authoptsp) +{ + int want_keytype = sshkey_is_cert(key) ? KEY_UNSPEC : key->type; + struct sshkey *found = NULL; + struct sshauthopt *keyopts = NULL, *certopts = NULL, *finalopts = NULL; + char *key_options = NULL, *fp = NULL; + const char *reason = NULL; + int ret = -1; + + if (authoptsp != NULL) + *authoptsp = NULL; + + if ((found = sshkey_new(want_keytype)) == NULL) { + debug3_f("keytype %d failed", want_keytype); + goto out; + } + + /* XXX djm: peek at key type in line and skip if unwanted */ + + if (sshkey_read(found, &cp) != 0) { + /* no key? check for options */ + debug2("%s: check options: '%s'", loc, cp); + key_options = cp; + if (sshkey_advance_past_options(&cp) != 0) { + reason = "invalid key option string"; + goto fail_reason; + } + skip_space(&cp); + if (sshkey_read(found, &cp) != 0) { + /* still no key? advance to next line*/ + debug2("%s: advance: '%s'", loc, cp); + goto out; + } + } + /* Parse key options now; we need to know if this is a CA key */ + if ((keyopts = sshauthopt_parse(key_options, &reason)) == NULL) { + debug("%s: bad key options: %s", loc, reason); + auth_debug_add("%s: bad key options: %s", loc, reason); + goto out; + } + /* Ignore keys that don't match or incorrectly marked as CAs */ + if (sshkey_is_cert(key)) { + /* Certificate; check signature key against CA */ + if (!sshkey_equal(found, key->cert->signature_key) || + !keyopts->cert_authority) + goto out; + } else { + /* Plain key: check it against key found in file */ + if (!sshkey_equal(found, key) || keyopts->cert_authority) + goto out; + } + + /* We have a candidate key, perform authorisation checks */ + if ((fp = sshkey_fingerprint(found, + SSH_FP_HASH_DEFAULT, SSH_FP_DEFAULT)) == NULL) + fatal_f("fingerprint failed"); + + debug("%s: matching %s found: %s %s", loc, + sshkey_is_cert(key) ? "CA" : "key", sshkey_type(found), fp); + + if (auth_authorise_keyopts(pw, keyopts, + sshkey_is_cert(key), remote_ip, remote_host, loc) != 0) { + reason = "Refused by key options"; + goto fail_reason; + } + /* That's all we need for plain keys. */ + if (!sshkey_is_cert(key)) { + verbose("Accepted key %s %s found at %s", + sshkey_type(found), fp, loc); + finalopts = keyopts; + keyopts = NULL; + goto success; + } + + /* + * Additional authorisation for certificates. + */ + + /* Parse and check options present in certificate */ + if ((certopts = sshauthopt_from_cert(key)) == NULL) { + reason = "Invalid certificate options"; + goto fail_reason; + } + if (auth_authorise_keyopts(pw, certopts, 0, + remote_ip, remote_host, loc) != 0) { + reason = "Refused by certificate options"; + goto fail_reason; + } + if ((finalopts = sshauthopt_merge(keyopts, certopts, &reason)) == NULL) + goto fail_reason; + + /* + * If the user has specified a list of principals as + * a key option, then prefer that list to matching + * their username in the certificate principals list. + */ + if (keyopts->cert_principals != NULL && + !match_principals_option(keyopts->cert_principals, key->cert)) { + reason = "Certificate does not contain an authorized principal"; + goto fail_reason; + } + if (sshkey_cert_check_authority_now(key, 0, 0, 0, + keyopts->cert_principals == NULL ? pw->pw_name : NULL, + &reason) != 0) + goto fail_reason; + + verbose("Accepted certificate ID \"%s\" (serial %llu) " + "signed by CA %s %s found at %s", + key->cert->key_id, + (unsigned long long)key->cert->serial, + sshkey_type(found), fp, loc); + + success: + if (finalopts == NULL) + fatal_f("internal error: missing options"); + if (authoptsp != NULL) { + *authoptsp = finalopts; + finalopts = NULL; + } + /* success */ + ret = 0; + goto out; + + fail_reason: + error("%s", reason); + auth_debug_add("%s", reason); + out: + free(fp); + sshauthopt_free(keyopts); + sshauthopt_free(certopts); + sshauthopt_free(finalopts); + sshkey_free(found); + return ret; +} + +/* + * Checks whether key is allowed in authorized_keys-format file, + * returns 1 if the key is allowed or 0 otherwise. + */ +int +auth_check_authkeys_file(struct passwd *pw, FILE *f, char *file, + struct sshkey *key, const char *remote_ip, + const char *remote_host, struct sshauthopt **authoptsp) +{ + char *cp, *line = NULL, loc[256]; + size_t linesize = 0; + int found_key = 0; + u_long linenum = 0, nonblank = 0; + + if (authoptsp != NULL) + *authoptsp = NULL; + + while (getline(&line, &linesize, f) != -1) { + linenum++; + /* Always consume entire file */ + if (found_key) + continue; + + /* Skip leading whitespace, empty and comment lines. */ + cp = line; + skip_space(&cp); + if (!*cp || *cp == '\n' || *cp == '#') + continue; + + nonblank++; + snprintf(loc, sizeof(loc), "%.200s:%lu", file, linenum); + if (auth_check_authkey_line(pw, key, cp, + remote_ip, remote_host, loc, authoptsp) == 0) + found_key = 1; + } + free(line); + debug2_f("%s: processed %lu/%lu lines", file, nonblank, linenum); + return found_key; +} + + From 9b3ad432ad2f19319bcc089370e356c6315d682f Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 27 May 2022 17:00:43 +1000 Subject: [PATCH 117/287] fuzzer for authorized_keys parsing mostly redundant to authopt_fuzz, but it's sensitive code so IMO it makes sense to test this layer too --- regress/misc/fuzz-harness/Makefile | 5 +- regress/misc/fuzz-harness/authkeys_fuzz.cc | 76 ++++++++++++++++++++++ 2 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 regress/misc/fuzz-harness/authkeys_fuzz.cc diff --git a/regress/misc/fuzz-harness/Makefile b/regress/misc/fuzz-harness/Makefile index 3938ac853..0b4238fd3 100644 --- a/regress/misc/fuzz-harness/Makefile +++ b/regress/misc/fuzz-harness/Makefile @@ -11,7 +11,7 @@ LIBS=-lssh -lopenbsd-compat -lmd -lcrypto -lfido2 -lcbor $(FUZZ_LIBS) SK_NULL_OBJS=ssh-sk-null.o COMMON_DEPS=../../../libssh.a -TARGETS=pubkey_fuzz sig_fuzz authopt_fuzz sshsig_fuzz \ +TARGETS=pubkey_fuzz sig_fuzz authopt_fuzz authkeys_fuzz sshsig_fuzz \ sshsigopt_fuzz privkey_fuzz kex_fuzz agent_fuzz all: $(TARGETS) @@ -28,6 +28,9 @@ sig_fuzz: sig_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) authopt_fuzz: authopt_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) $(CXX) -o $@ authopt_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o $(LDFLAGS) $(LIBS) +authkeys_fuzz: authkeys_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) + $(CXX) -o $@ authkeys_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o ../../../auth2-pubkeyfile.o $(LDFLAGS) $(LIBS) + sshsig_fuzz: sshsig_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) $(CXX) -o $@ sshsig_fuzz.o $(SK_NULL_OBJS) ../../../sshsig.o $(LDFLAGS) $(LIBS) diff --git a/regress/misc/fuzz-harness/authkeys_fuzz.cc b/regress/misc/fuzz-harness/authkeys_fuzz.cc new file mode 100644 index 000000000..6fe001fac --- /dev/null +++ b/regress/misc/fuzz-harness/authkeys_fuzz.cc @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include +#include +#include + +extern "C" { + +#include "hostfile.h" +#include "auth.h" +#include "auth-options.h" +#include "sshkey.h" + +// testdata/id_ed25519.pub and testdata/id_ed25519-cert.pub +const char *pubkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDPQXmEVMVLmeFRyafKMVWgPDkv8/uRBTwmcEDatZzMD"; +const char *certtext = "ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQG9wZW5zc2guY29tAAAAIMDQjYH6XRzH3j3MW1DdjCoAfvrHfgjnVGF+sLK0pBfqAAAAIDPQXmEVMVLmeFRyafKMVWgPDkv8/uRBTwmcEDatZzMDAAAAAAAAA+sAAAABAAAAB3VseXNzZXMAAAAXAAAAB3VseXNzZXMAAAAIb2R5c3NldXMAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAADMAAAALc3NoLWVkMjU1MTkAAAAgM9BeYRUxUuZ4VHJp8oxVaA8OS/z+5EFPCZwQNq1nMwMAAABTAAAAC3NzaC1lZDI1NTE5AAAAQBj0og+s09/HpwdHZbzN0twooKPDWWrxGfnP1Joy6cDnY2BCSQ7zg9vbq11kLF8H/sKOTZWAQrUZ7LlChOu9Ogw= id_ed25519.pub"; + +// stubs +void auth_debug_add(const char *fmt,...) +{ +} + +void +auth_log_authopts(const char *loc, const struct sshauthopt *opts, int do_remote) +{ +} + +int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) +{ + char *tmp, *o, *cp = (char *)malloc(size + 1 + strlen(pubkey) + 1); + struct sshauthopt *opts = NULL; + struct passwd *pw = getpwuid(getuid()); + static struct sshkey *key, *cert; + + if (key == NULL) { + if ((key = sshkey_new(KEY_UNSPEC)) == NULL || + (cert = sshkey_new(KEY_UNSPEC)) == NULL) + abort(); + if ((o = tmp = strdup(pubkey)) == NULL || + sshkey_read(key, &tmp) != 0) + abort(); + free(o); + if ((o = tmp = strdup(certtext)) == NULL || + sshkey_read(cert, &tmp) != 0) + abort(); + free(o); + } + if (cp == NULL || pw == NULL || key == NULL || cert == NULL) + abort(); + memcpy(cp, data, size); + cp[size] = ' '; + memcpy(cp + size + 1, key, strlen(pubkey) + 1); + + // Try key. + if ((tmp = strdup(cp)) == NULL) + abort(); + (void) auth_check_authkey_line(pw, key, tmp, "127.0.0.1", "localhost", + "fuzz", &opts); + free(tmp); + sshauthopt_free(opts); + + // Try cert. + if ((tmp = strdup(cp)) == NULL) + abort(); + (void) auth_check_authkey_line(pw, cert, tmp, "127.0.0.1", "localhost", + "fuzz", &opts); + free(tmp); + sshauthopt_free(opts); + + free(cp); + return 0; +} + +} // extern "C" From c53906e0c59e569691b4095d3e8db79cf78fa058 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 27 May 2022 18:18:31 +1000 Subject: [PATCH 118/287] Test against LibreSSL 3.5.3. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 092b91fdf..e1dca1d48 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -48,7 +48,7 @@ jobs: - { os: ubuntu-latest, configs: libressl-3.2.6 } - { os: ubuntu-latest, configs: libressl-3.3.6 } - { os: ubuntu-latest, configs: libressl-3.4.3 } - - { os: ubuntu-latest, configs: libressl-3.5.2 } + - { os: ubuntu-latest, configs: libressl-3.5.3 } - { os: ubuntu-latest, configs: openssl-master } - { os: ubuntu-latest, configs: openssl-noec } - { os: ubuntu-latest, configs: openssl-1.0.1 } From 1781f507c113667613351c19898efaf1e311a865 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 27 May 2022 18:19:48 +1000 Subject: [PATCH 119/287] Test against OpenSSL 1.1.1o and 3.0.3. --- .github/workflows/c-cpp.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index e1dca1d48..49da0f4a6 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -58,8 +58,9 @@ jobs: - { os: ubuntu-latest, configs: openssl-1.1.1 } - { os: ubuntu-latest, configs: openssl-1.1.1k } - { os: ubuntu-latest, configs: openssl-1.1.1n } + - { os: ubuntu-latest, configs: openssl-1.1.1o } - { os: ubuntu-latest, configs: openssl-3.0.0 } - - { os: ubuntu-latest, configs: openssl-3.0.2 } + - { os: ubuntu-latest, configs: openssl-3.0.3 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - { os: ubuntu-18.04, configs: pam } From dc7bc52372f2744fa39191577be5306ee57aacd4 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 30 May 2022 09:29:09 +1000 Subject: [PATCH 120/287] fix some bugs in the fuzzer --- regress/misc/fuzz-harness/authkeys_fuzz.cc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/regress/misc/fuzz-harness/authkeys_fuzz.cc b/regress/misc/fuzz-harness/authkeys_fuzz.cc index 6fe001fac..8b3e54e54 100644 --- a/regress/misc/fuzz-harness/authkeys_fuzz.cc +++ b/regress/misc/fuzz-harness/authkeys_fuzz.cc @@ -49,9 +49,14 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) } if (cp == NULL || pw == NULL || key == NULL || cert == NULL) abort(); + + // Cleanup whitespace at input EOL. + for (; size > 0 && strchr(" \t\r\n", data[size - 1]) != NULL; size--) ; + + // Append a pubkey that will match. memcpy(cp, data, size); cp[size] = ' '; - memcpy(cp + size + 1, key, strlen(pubkey) + 1); + memcpy(cp + size + 1, pubkey, strlen(pubkey) + 1); // Try key. if ((tmp = strdup(cp)) == NULL) From b7f86ffc301be105bba9a3e0618b6fab3ae379bd Mon Sep 17 00:00:00 2001 From: "jmc@openbsd.org" Date: Sat, 28 May 2022 05:57:56 +0000 Subject: [PATCH 121/287] upstream: keywords ref ssh_config.5; from caspar schutijser OpenBSD-Commit-ID: f146a19d7d5c9374c3b9c520da43b2732d7d1a4e --- ssh.1 | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ssh.1 b/ssh.1 index 4a4f1683a..b4956aec9 100644 --- a/ssh.1 +++ b/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.430 2022/03/31 17:27:27 naddy Exp $ -.Dd $Mdocdate: March 31 2022 $ +.\" $OpenBSD: ssh.1,v 1.431 2022/05/28 05:57:56 jmc Exp $ +.Dd $Mdocdate: May 28 2022 $ .Dt SSH 1 .Os .Sh NAME @@ -159,7 +159,8 @@ slow connections, but will only slow down things on fast networks. The default value can be set on a host-by-host basis in the configuration files; see the .Cm Compression -option. +option in +.Xr ssh_config 5 . .Pp .It Fl c Ar cipher_spec Selects the cipher specification for encrypting the session. @@ -434,7 +435,9 @@ A comma-separated list of MAC (message authentication code) algorithms, specified in order of preference. See the .Cm MACs -keyword for more information. +keyword in +.Xr ssh_config 5 +for more information. .Pp .It Fl N Do not execute a remote command. From 6b3fb624675082a1e5aa615d1b8479873d8b5731 Mon Sep 17 00:00:00 2001 From: "naddy@openbsd.org" Date: Tue, 31 May 2022 14:05:12 +0000 Subject: [PATCH 122/287] upstream: ssh-keygen: implement "verify-required" certificate option. This was already documented when support for user-verified FIDO keys was added, but the ssh-keygen(1) code was missing. ok djm@ OpenBSD-Commit-ID: f660f973391b593fea4b7b25913c9a15c3eb8a06 --- ssh-keygen.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index e76007323..35e70a102 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.452 2022/05/09 03:09:53 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.453 2022/05/31 14:05:12 naddy Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -127,6 +127,7 @@ static u_int64_t cert_valid_to = ~0ULL; #define CERTOPT_PTY (1<<3) #define CERTOPT_USER_RC (1<<4) #define CERTOPT_NO_REQUIRE_USER_PRESENCE (1<<5) +#define CERTOPT_REQUIRE_VERIFY (1<<6) #define CERTOPT_DEFAULT (CERTOPT_X_FWD|CERTOPT_AGENT_FWD| \ CERTOPT_PORT_FWD|CERTOPT_PTY|CERTOPT_USER_RC) static u_int32_t certflags_flags = CERTOPT_DEFAULT; @@ -1672,6 +1673,8 @@ finalise_cert_exts(void) cert_ext_add("force-command", certflags_command, 1); if (certflags_src_addr != NULL) cert_ext_add("source-address", certflags_src_addr, 1); + if ((certflags_flags & CERTOPT_REQUIRE_VERIFY) != 0) + cert_ext_add("verify-required", NULL, 1); /* extensions */ if ((certflags_flags & CERTOPT_X_FWD) != 0) cert_ext_add("permit-X11-forwarding", NULL, 0); @@ -1993,6 +1996,10 @@ add_cert_option(char *opt) certflags_flags &= ~CERTOPT_NO_REQUIRE_USER_PRESENCE; else if (strcasecmp(opt, "no-touch-required") == 0) certflags_flags |= CERTOPT_NO_REQUIRE_USER_PRESENCE; + else if (strcasecmp(opt, "no-verify-required") == 0) + certflags_flags &= ~CERTOPT_REQUIRE_VERIFY; + else if (strcasecmp(opt, "verify-required") == 0) + certflags_flags |= CERTOPT_REQUIRE_VERIFY; else if (strncasecmp(opt, "force-command=", 14) == 0) { val = opt + 14; if (*val == '\0') @@ -2051,6 +2058,9 @@ show_options(struct sshbuf *optbuf, int in_critical) fatal_fr(r, "parse critical"); printf(" %s\n", arg); free(arg); + } else if (in_critical && + strcmp(name, "verify-required") == 0) { + printf("\n"); } else if (sshbuf_len(option) > 0) { hex = sshbuf_dtob16(option); printf(" UNKNOWN OPTION: %s (len %zu)\n", From 88e376fcd67478ad1660d94bc73ab348ac9f4527 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 3 Jun 2022 03:17:42 +0000 Subject: [PATCH 123/287] upstream: ssh-keygen -A: do not generate DSA keys by default. Based on github PR#303 from jsegitz with man page text from jmc@, ok markus@ djm@ OpenBSD-Commit-ID: 5c4c57bdd7063ff03381cfb6696659dd3f9f5b9f --- ssh-keygen.1 | 10 +++++----- ssh-keygen.c | 3 +-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index 4e7245366..5f4298137 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.222 2022/05/09 03:09:53 djm Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.223 2022/06/03 03:17:42 dtucker Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: May 9 2022 $ +.Dd $Mdocdate: June 3 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -271,9 +271,9 @@ should be placed to be activated. The options are as follows: .Bl -tag -width Ds .It Fl A -For each of the key types (rsa, dsa, ecdsa and ed25519) -for which host keys -do not exist, generate the host keys with the default key file path, +Generate host keys of all default key types (rsa, ecdsa, and +ed25519) if they do not already exist. +The host keys are generated with the default key file path, an empty passphrase, default bits for the key type, and default comment. If .Fl f diff --git a/ssh-keygen.c b/ssh-keygen.c index 35e70a102..f122cbd1b 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.453 2022/05/31 14:05:12 naddy Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.454 2022/06/03 03:17:42 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -1045,7 +1045,6 @@ do_gen_all_hostkeys(struct passwd *pw) } key_types[] = { #ifdef WITH_OPENSSL { "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE }, - { "dsa", "DSA", _PATH_HOST_DSA_KEY_FILE }, #ifdef OPENSSL_HAS_ECC { "ecdsa", "ECDSA",_PATH_HOST_ECDSA_KEY_FILE }, #endif /* OPENSSL_HAS_ECC */ From ea97ec98c41ec2b755dfab459347db674ff9a5de Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 3 Jun 2022 03:21:09 +0000 Subject: [PATCH 124/287] upstream: Add period at end of "not known by any other names" message. github PR#320 from jschauma, ok djm@ OpenBSD-Commit-ID: bd60809803c4bfd3ebb7c5c4d918b10e275266f2 --- sshconnect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sshconnect.c b/sshconnect.c index ebecc8374..dcd1036d1 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.356 2021/12/19 22:10:24 djm Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.357 2022/06/03 03:21:09 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -816,7 +816,7 @@ other_hostkeys_message(const char *host, const char *ip, system_hostfiles, num_system_hostfiles, &othernames, &num_othernames); if (num_othernames == 0) - return xstrdup("This key is not known by any other names"); + return xstrdup("This key is not known by any other names."); xasprintf(&ret, "This host key is known by the following other " "names/addresses:"); From 38ed6c57e9e592c08e020fa6e82b45b4e1040970 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 3 Jun 2022 04:00:15 +0000 Subject: [PATCH 125/287] upstream: Add missing *-sk types to ssh-keyscan manpage. From skazi0 via github PR#294. OpenBSD-Commit-ID: fda2c869cdb871f3c90a89fb3f985370bb5d25c0 --- ssh-keyscan.1 | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ssh-keyscan.1 b/ssh-keyscan.1 index f9df75d42..4eb0bea09 100644 --- a/ssh-keyscan.1 +++ b/ssh-keyscan.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keyscan.1,v 1.45 2019/11/30 07:07:59 jmc Exp $ +.\" $OpenBSD: ssh-keyscan.1,v 1.46 2022/06/03 04:00:15 dtucker Exp $ .\" .\" Copyright 1995, 1996 by David Mazieres . .\" @@ -6,7 +6,7 @@ .\" permitted provided that due credit is given to the author and the .\" OpenBSD project by leaving this copyright notice intact. .\" -.Dd $Mdocdate: November 30 2019 $ +.Dd $Mdocdate: June 3 2022 $ .Dt SSH-KEYSCAN 1 .Os .Sh NAME @@ -103,14 +103,18 @@ The possible values are .Dq dsa , .Dq ecdsa , .Dq ed25519 , +.Dq ecdsa-sk , +.Dq ed25519-sk , or .Dq rsa . Multiple values may be specified by separating them with commas. The default is to fetch .Dq rsa , .Dq ecdsa , +.Dq ed25519 , +.Dq ecdsa-sk , and -.Dq ed25519 +.Dq ed25519-sk keys. .It Fl v Verbose mode: From 22e1a3a71ad6d108ff0c5f07f93c3fcbd30f8b40 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 3 Jun 2022 04:30:46 +0000 Subject: [PATCH 126/287] upstream: Make SetEnv directives first-match-wins in both sshd_config and sshd_config; previously if the same name was reused then the last would win (which is the opposite to how the config is supposed to work). While there, make the ssh_config parsing more like sshd_config. bz3438, ok dtucker OpenBSD-Commit-ID: 797909c1e0262c0d00e09280459d7ab00f18273b --- clientloop.c | 9 +++++---- misc.c | 19 ++++++++++++++++++- misc.h | 4 +++- mux.c | 9 +++++---- readconf.c | 41 +++++++++++++++-------------------------- readconf.h | 10 +++++----- servconf.c | 8 +++++++- 7 files changed, 58 insertions(+), 42 deletions(-) diff --git a/clientloop.c b/clientloop.c index 1d80683c0..0050f3eb6 100644 --- a/clientloop.c +++ b/clientloop.c @@ -1,4 +1,4 @@ -/* $OpenBSD: clientloop.c,v 1.379 2022/04/20 04:19:11 djm Exp $ */ +/* $OpenBSD: clientloop.c,v 1.380 2022/06/03 04:30:46 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2467,7 +2467,8 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, const char *term, struct termios *tiop, int in_fd, struct sshbuf *cmd, char **env) { - int i, j, matched, len, r; + size_t i, j, len; + int matched, r; char *name, *val; Channel *c = NULL; @@ -2550,13 +2551,13 @@ client_session2_setup(struct ssh *ssh, int id, int want_tty, int want_subsystem, len = 900; if (want_subsystem) { debug("Sending subsystem: %.*s", - len, (const u_char*)sshbuf_ptr(cmd)); + (int)len, (const u_char*)sshbuf_ptr(cmd)); channel_request_start(ssh, id, "subsystem", 1); client_expect_confirm(ssh, id, "subsystem", CONFIRM_CLOSE); } else { debug("Sending command: %.*s", - len, (const u_char*)sshbuf_ptr(cmd)); + (int)len, (const u_char*)sshbuf_ptr(cmd)); channel_request_start(ssh, id, "exec", 1); client_expect_confirm(ssh, id, "exec", CONFIRM_CLOSE); } diff --git a/misc.c b/misc.c index 85d223695..a8e87430e 100644 --- a/misc.c +++ b/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.175 2022/03/20 08:51:21 djm Exp $ */ +/* $OpenBSD: misc.c,v 1.176 2022/06/03 04:30:47 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2793,3 +2793,20 @@ lookup_env_in_list(const char *env, char * const *envs, size_t nenvs) } return NULL; } + +const char * +lookup_setenv_in_list(const char *env, char * const *envs, size_t nenvs) +{ + char *name, *cp; + const char *ret; + + name = xstrdup(env); + if ((cp = strchr(name, '=')) == NULL) { + free(name); + return NULL; /* not env=val */ + } + *cp = '\0'; + ret = lookup_env_in_list(name, envs, nenvs); + free(name); + return ret; +} diff --git a/misc.h b/misc.h index 2e1b5feca..7ef75bd09 100644 --- a/misc.h +++ b/misc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.h,v 1.99 2021/11/13 21:14:13 deraadt Exp $ */ +/* $OpenBSD: misc.h,v 1.100 2022/06/03 04:30:47 djm Exp $ */ /* * Author: Tatu Ylonen @@ -179,6 +179,8 @@ void child_set_env(char ***envp, u_int *envsizep, const char *name, const char *value); const char *lookup_env_in_list(const char *env, char * const *envs, size_t nenvs); +const char *lookup_setenv_in_list(const char *env, + char * const *envs, size_t nenvs); int argv_split(const char *, int *, char ***, int); char *argv_assemble(int, char **argv); diff --git a/mux.c b/mux.c index 924fbead0..3cb387614 100644 --- a/mux.c +++ b/mux.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mux.c,v 1.93 2022/05/05 00:55:11 djm Exp $ */ +/* $OpenBSD: mux.c,v 1.94 2022/06/03 04:30:47 djm Exp $ */ /* * Copyright (c) 2002-2008 Damien Miller * @@ -242,7 +242,8 @@ mux_master_control_cleanup_cb(struct ssh *ssh, int cid, void *unused) static int env_permitted(const char *env) { - int i, ret; + u_int i; + int ret; char name[1024], *cp; if ((cp = strchr(env, '=')) == NULL || cp == env) @@ -1865,9 +1866,9 @@ mux_client_request_session(int fd) struct sshbuf *m; char *e; const char *term = NULL; - u_int echar, rid, sid, esid, exitval, type, exitval_seen; + u_int i, echar, rid, sid, esid, exitval, type, exitval_seen; extern char **environ; - int r, i, rawmode; + int r, rawmode; debug3_f("entering"); diff --git a/readconf.c b/readconf.c index 55d2b1a38..7f26c6804 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.367 2022/04/20 15:56:49 millert Exp $ */ +/* $OpenBSD: readconf.c,v 1.368 2022/06/03 04:30:47 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -753,7 +753,7 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, static void rm_env(Options *options, const char *arg, const char *filename, int linenum) { - int i, j, onum_send_env = options->num_send_env; + u_int i, j, onum_send_env = options->num_send_env; /* Remove an environment variable */ for (i = 0; i < options->num_send_env; ) { @@ -1733,20 +1733,10 @@ parse_pubkey_algos: /* Removing an env var */ rm_env(options, arg, filename, linenum); continue; - } else { - /* Adding an env var */ - if (options->num_send_env >= INT_MAX) { - error("%s line %d: too many send env.", - filename, linenum); - goto out; - } - options->send_env = xrecallocarray( - options->send_env, options->num_send_env, - options->num_send_env + 1, - sizeof(*options->send_env)); - options->send_env[options->num_send_env++] = - xstrdup(arg); } + opt_array_append(filename, linenum, + lookup_opcode_name(opcode), + &options->send_env, &options->num_send_env, arg); } break; @@ -1760,16 +1750,15 @@ parse_pubkey_algos: } if (!*activep || value != 0) continue; - /* Adding a setenv var */ - if (options->num_setenv >= INT_MAX) { - error("%s line %d: too many SetEnv.", - filename, linenum); - goto out; + if (lookup_setenv_in_list(arg, options->setenv, + options->num_setenv) != NULL) { + debug2("%s line %d: ignoring duplicate env " + "name \"%.64s\"", filename, linenum, arg); + continue; } - options->setenv = xrecallocarray( - options->setenv, options->num_setenv, - options->num_setenv + 1, sizeof(*options->setenv)); - options->setenv[options->num_setenv++] = xstrdup(arg); + opt_array_append(filename, linenum, + lookup_opcode_name(opcode), + &options->setenv, &options->num_setenv, arg); } break; @@ -2770,9 +2759,9 @@ free_options(Options *o) } free(o->remote_forwards); free(o->stdio_forward_host); - FREE_ARRAY(int, o->num_send_env, o->send_env); + FREE_ARRAY(u_int, o->num_send_env, o->send_env); free(o->send_env); - FREE_ARRAY(int, o->num_setenv, o->setenv); + FREE_ARRAY(u_int, o->num_setenv, o->setenv); free(o->setenv); free(o->control_path); free(o->local_command); diff --git a/readconf.h b/readconf.h index ded13c943..f647bd42a 100644 --- a/readconf.h +++ b/readconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.h,v 1.146 2021/12/19 22:14:47 djm Exp $ */ +/* $OpenBSD: readconf.h,v 1.147 2022/06/03 04:30:47 djm Exp $ */ /* * Author: Tatu Ylonen @@ -124,10 +124,10 @@ typedef struct { int server_alive_interval; int server_alive_count_max; - int num_send_env; - char **send_env; - int num_setenv; - char **setenv; + u_int num_send_env; + char **send_env; + u_int num_setenv; + char **setenv; char *control_path; int control_master; diff --git a/servconf.c b/servconf.c index 9d9681f15..29df0463d 100644 --- a/servconf.c +++ b/servconf.c @@ -1,5 +1,5 @@ -/* $OpenBSD: servconf.c,v 1.384 2022/03/18 04:04:11 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.385 2022/06/03 04:30:47 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -2033,6 +2033,12 @@ process_server_config_line_depth(ServerOptions *options, char *line, filename, linenum); if (!*activep || uvalue != 0) continue; + if (lookup_setenv_in_list(arg, options->setenv, + options->num_setenv) != NULL) { + debug2("%s line %d: ignoring duplicate env " + "name \"%.64s\"", filename, linenum, arg); + continue; + } opt_array_append(filename, linenum, keyword, &options->setenv, &options->num_setenv, arg); } From 3d9b0845f34510111cc693bb99a667662ca50cd8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 3 Jun 2022 04:31:54 +0000 Subject: [PATCH 127/287] upstream: test setenv in both client and server, test first-match-wins too OpenBSD-Regress-ID: 4c8804f9db38a02db480b9923317457b377fe34b --- regress/envpass.sh | 67 +++++++++++++++++++++++++++++++++++++++++++- regress/multiplex.sh | 16 +++++++++-- 2 files changed, 79 insertions(+), 4 deletions(-) diff --git a/regress/envpass.sh b/regress/envpass.sh index af7eafe3d..cb104686b 100644 --- a/regress/envpass.sh +++ b/regress/envpass.sh @@ -1,4 +1,4 @@ -# $OpenBSD: envpass.sh,v 1.4 2005/03/04 08:48:46 djm Exp $ +# $OpenBSD: envpass.sh,v 1.5 2022/06/03 04:31:54 djm Exp $ # Placed in the Public Domain. tid="environment passing" @@ -11,6 +11,7 @@ Host test-sendenv-confparse-bug SendEnv * EOF cat $OBJ/ssh_proxy >> $OBJ/ssh_proxy_envpass +cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak trace "pass env, don't accept" verbose "test $tid: pass env, don't accept" @@ -23,6 +24,18 @@ if [ $r -ne 0 ]; then fail "environment found" fi +trace "setenv, don't accept" +verbose "test $tid: setenv, don't accept" +${SSH} -oSendEnv="*" -F $OBJ/ssh_proxy_envpass -oSetEnv="_TEST_ENV=blah" \ + otherhost \ + sh << 'EOF' + test -z "$_TEST_ENV" +EOF +r=$? +if [ $r -ne 0 ]; then + fail "environment found" +fi + trace "don't pass env, accept" verbose "test $tid: don't pass env, accept" _XXX_TEST_A=1 _XXX_TEST_B=2 ${SSH} -F $OBJ/ssh_proxy_envpass otherhost \ @@ -57,4 +70,56 @@ if [ $r -ne 0 ]; then fail "environment not found" fi +trace "setenv, accept" +verbose "test $tid: setenv, accept" +${SSH} -F $OBJ/ssh_proxy_envpass \ + -oSetEnv="_XXX_TEST_A=1 _XXX_TEST_B=2" otherhost \ + sh << 'EOF' + test X"$_XXX_TEST_A" = X"1" -a X"$_XXX_TEST_B" = X"2" +EOF +r=$? +if [ $r -ne 0 ]; then + fail "environment not found" +fi +trace "setenv, first match wins" +verbose "test $tid: setenv, first match wins" +${SSH} -F $OBJ/ssh_proxy_envpass \ + -oSetEnv="_XXX_TEST_A=1 _XXX_TEST_A=11 _XXX_TEST_B=2" otherhost \ + sh << 'EOF' + test X"$_XXX_TEST_A" = X"1" -a X"$_XXX_TEST_B" = X"2" +EOF +r=$? +if [ $r -ne 0 ]; then + fail "environment not found" +fi + +trace "server setenv wins" +verbose "test $tid: server setenv wins" +cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy +echo "SetEnv _XXX_TEST_A=23" >> $OBJ/sshd_proxy +${SSH} -F $OBJ/ssh_proxy_envpass \ + -oSetEnv="_XXX_TEST_A=1 _XXX_TEST_B=2" otherhost \ + sh << 'EOF' + test X"$_XXX_TEST_A" = X"23" -a X"$_XXX_TEST_B" = X"2" +EOF +r=$? +if [ $r -ne 0 ]; then + fail "environment not found" +fi + +trace "server setenv first match wins" +verbose "test $tid: server setenv wins" +cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy +echo "SetEnv _XXX_TEST_A=23 _XXX_TEST_A=42" >> $OBJ/sshd_proxy +${SSH} -F $OBJ/ssh_proxy_envpass \ + -oSetEnv="_XXX_TEST_A=1 _XXX_TEST_B=2" otherhost \ + sh << 'EOF' + test X"$_XXX_TEST_A" = X"23" -a X"$_XXX_TEST_B" = X"2" +EOF +r=$? +if [ $r -ne 0 ]; then + fail "environment not found" +fi + + rm -f $OBJ/ssh_proxy_envpass diff --git a/regress/multiplex.sh b/regress/multiplex.sh index 4744fa3d9..2950d955a 100644 --- a/regress/multiplex.sh +++ b/regress/multiplex.sh @@ -1,4 +1,4 @@ -# $OpenBSD: multiplex.sh,v 1.33 2020/06/24 15:16:23 markus Exp $ +# $OpenBSD: multiplex.sh,v 1.34 2022/06/03 04:31:54 djm Exp $ # Placed in the Public Domain. make_tmpdir @@ -38,8 +38,8 @@ start_mux_master() start_mux_master -verbose "test $tid: envpass" -trace "env passing over multiplexed connection" +verbose "test $tid: setenv" +trace "setenv over multiplexed connection" _XXX_TEST=blah ${SSH} -F $OBJ/ssh_config -oSendEnv="_XXX_TEST" -S$CTL otherhost sh << 'EOF' test X"$_XXX_TEST" = X"blah" EOF @@ -47,6 +47,16 @@ if [ $? -ne 0 ]; then fail "environment not found" fi +verbose "test $tid: envpass" +trace "env passing over multiplexed connection" +${SSH} -F $OBJ/ssh_config -oSetEnv="_XXX_TEST=foo" -S$CTL otherhost sh << 'EOF' + test X"$_XXX_TEST" = X"foo" +EOF +if [ $? -ne 0 ]; then + fail "environment not found" +fi + + verbose "test $tid: transfer" rm -f ${COPY} trace "ssh transfer over multiplexed connection and check result" From acb2059febaddd71ee06c2ebf63dcf211d9ab9f2 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 3 Jun 2022 04:47:21 +0000 Subject: [PATCH 128/287] upstream: move auth_openprincipals() and auth_openkeyfile() over to auth2-pubkeyfile.c too; they make more sense there. OpenBSD-Commit-ID: 9970d99f900e1117fdaab13e9e910a621b7c60ee --- auth.c | 58 +--------------------------------------------- auth.h | 6 ++--- auth2-pubkeyfile.c | 57 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 61 deletions(-) diff --git a/auth.c b/auth.c index 9ad9034aa..13e8d7998 100644 --- a/auth.c +++ b/auth.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.c,v 1.157 2022/05/27 05:02:46 djm Exp $ */ +/* $OpenBSD: auth.c,v 1.158 2022/06/03 04:47:21 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -460,62 +460,6 @@ check_key_in_hostfiles(struct passwd *pw, struct sshkey *key, const char *host, return host_status; } -static FILE * -auth_openfile(const char *file, struct passwd *pw, int strict_modes, - int log_missing, char *file_type) -{ - char line[1024]; - struct stat st; - int fd; - FILE *f; - - if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) { - if (log_missing || errno != ENOENT) - debug("Could not open %s '%s': %s", file_type, file, - strerror(errno)); - return NULL; - } - - if (fstat(fd, &st) == -1) { - close(fd); - return NULL; - } - if (!S_ISREG(st.st_mode)) { - logit("User %s %s %s is not a regular file", - pw->pw_name, file_type, file); - close(fd); - return NULL; - } - unset_nonblock(fd); - if ((f = fdopen(fd, "r")) == NULL) { - close(fd); - return NULL; - } - if (strict_modes && - safe_path_fd(fileno(f), file, pw, line, sizeof(line)) != 0) { - fclose(f); - logit("Authentication refused: %s", line); - auth_debug_add("Ignored %s: %s", file_type, line); - return NULL; - } - - return f; -} - - -FILE * -auth_openkeyfile(const char *file, struct passwd *pw, int strict_modes) -{ - return auth_openfile(file, pw, strict_modes, 1, "authorized keys"); -} - -FILE * -auth_openprincipals(const char *file, struct passwd *pw, int strict_modes) -{ - return auth_openfile(file, pw, strict_modes, 0, - "authorized principals"); -} - struct passwd * getpwnamallow(struct ssh *ssh, const char *user) { diff --git a/auth.h b/auth.h index b8eec4a6a..b743406ea 100644 --- a/auth.h +++ b/auth.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.104 2022/05/27 05:02:46 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.105 2022/06/03 04:47:21 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -193,8 +193,6 @@ struct passwd * getpwnamallow(struct ssh *, const char *user); char *expand_authorized_keys(const char *, struct passwd *pw); char *authorized_principals_file(struct passwd *); -FILE *auth_openkeyfile(const char *, struct passwd *, int); -FILE *auth_openprincipals(const char *, struct passwd *, int); int auth_key_is_revoked(struct sshkey *); const char *auth_get_canonical_hostname(struct ssh *, int); @@ -237,6 +235,8 @@ int auth_check_authkey_line(struct passwd *, struct sshkey *, char *, const char *, const char *, const char *, struct sshauthopt **); int auth_check_authkeys_file(struct passwd *, FILE *, char *, struct sshkey *, const char *, const char *, struct sshauthopt **); +FILE *auth_openkeyfile(const char *, struct passwd *, int); +FILE *auth_openprincipals(const char *, struct passwd *, int); int sys_auth_passwd(struct ssh *, const char *); diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c index a304d0953..911f01baf 100644 --- a/auth2-pubkeyfile.c +++ b/auth2-pubkeyfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkeyfile.c,v 1.1 2022/05/27 05:02:46 djm Exp $ */ +/* $OpenBSD: auth2-pubkeyfile.c,v 1.2 2022/06/03 04:47:21 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -439,4 +439,59 @@ auth_check_authkeys_file(struct passwd *pw, FILE *f, char *file, return found_key; } +static FILE * +auth_openfile(const char *file, struct passwd *pw, int strict_modes, + int log_missing, char *file_type) +{ + char line[1024]; + struct stat st; + int fd; + FILE *f; + + if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) { + if (log_missing || errno != ENOENT) + debug("Could not open %s '%s': %s", file_type, file, + strerror(errno)); + return NULL; + } + + if (fstat(fd, &st) == -1) { + close(fd); + return NULL; + } + if (!S_ISREG(st.st_mode)) { + logit("User %s %s %s is not a regular file", + pw->pw_name, file_type, file); + close(fd); + return NULL; + } + unset_nonblock(fd); + if ((f = fdopen(fd, "r")) == NULL) { + close(fd); + return NULL; + } + if (strict_modes && + safe_path_fd(fileno(f), file, pw, line, sizeof(line)) != 0) { + fclose(f); + logit("Authentication refused: %s", line); + auth_debug_add("Ignored %s: %s", file_type, line); + return NULL; + } + + return f; +} + + +FILE * +auth_openkeyfile(const char *file, struct passwd *pw, int strict_modes) +{ + return auth_openfile(file, pw, strict_modes, 1, "authorized keys"); +} + +FILE * +auth_openprincipals(const char *file, struct passwd *pw, int strict_modes) +{ + return auth_openfile(file, pw, strict_modes, 0, + "authorized principals"); +} From f5ba85daddfc2da6a8dab6038269e02c0695be44 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 15 Jun 2022 16:08:25 +0000 Subject: [PATCH 129/287] upstream: make sure that UseDNS hostname lookup happens in the monitor and not in the pledge(2)'d unprivileged process; fixes regression caused by recent refactoring spotted by henning@ OpenBSD-Commit-ID: a089870b95101cd8881a2dff65b2f1627d13e88d --- auth.h | 6 +++--- auth2-pubkey.c | 19 ++++++++----------- monitor.c | 9 +++------ monitor_wrap.c | 7 +++---- monitor_wrap.h | 6 +++--- 5 files changed, 20 insertions(+), 27 deletions(-) diff --git a/auth.h b/auth.h index b743406ea..6d2d39762 100644 --- a/auth.h +++ b/auth.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.h,v 1.105 2022/06/03 04:47:21 djm Exp $ */ +/* $OpenBSD: auth.h,v 1.106 2022/06/15 16:08:25 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -135,8 +135,8 @@ int auth_password(struct ssh *, const char *); int hostbased_key_allowed(struct ssh *, struct passwd *, const char *, char *, struct sshkey *); -int user_key_allowed(struct passwd *, struct sshkey *, int, - const char *, const char *, struct sshauthopt **); +int user_key_allowed(struct ssh *ssh, struct passwd *, struct sshkey *, + int, struct sshauthopt **); int auth2_key_already_used(Authctxt *, const struct sshkey *); /* diff --git a/auth2-pubkey.c b/auth2-pubkey.c index 952af119e..962fd3420 100644 --- a/auth2-pubkey.c +++ b/auth2-pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.115 2022/05/27 05:02:46 djm Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.116 2022/06/15 16:08:25 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -98,9 +98,6 @@ userauth_pubkey(struct ssh *ssh, const char *method) int req_presence = 0, req_verify = 0, authenticated = 0; struct sshauthopt *authopts = NULL; struct sshkey_sig_details *sig_details = NULL; - const char *remote_ip = ssh_remote_ipaddr(ssh); - const char *remote_host = auth_get_canonical_hostname(ssh, - options.use_dns); hostbound = strcmp(method, "publickey-hostbound-v00@openssh.com") == 0; @@ -223,8 +220,7 @@ userauth_pubkey(struct ssh *ssh, const char *method) #endif /* test for correct signature */ authenticated = 0; - if (PRIVSEP(user_key_allowed(pw, key, 1, remote_ip, - remote_host, &authopts)) && + if (PRIVSEP(user_key_allowed(ssh, pw, key, 1, &authopts)) && PRIVSEP(sshkey_verify(key, sig, slen, sshbuf_ptr(b), sshbuf_len(b), (ssh->compat & SSH_BUG_SIGTYPE) == 0 ? pkalg : NULL, @@ -286,8 +282,7 @@ userauth_pubkey(struct ssh *ssh, const char *method) * if a user is not allowed to login. is this an * issue? -markus */ - if (PRIVSEP(user_key_allowed(pw, key, 0, remote_ip, - remote_host, NULL))) { + if (PRIVSEP(user_key_allowed(ssh, pw, key, 0, NULL))) { if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_PK_OK)) != 0 || (r = sshpkt_put_cstring(ssh, pkalg)) != 0 || @@ -751,13 +746,15 @@ user_key_command_allowed2(struct passwd *user_pw, struct sshkey *key, * Check whether key authenticates and authorises the user. */ int -user_key_allowed(struct passwd *pw, struct sshkey *key, - int auth_attempt, const char *remote_ip, const char *remote_host, - struct sshauthopt **authoptsp) +user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, + int auth_attempt, struct sshauthopt **authoptsp) { u_int success = 0, i; char *file; struct sshauthopt *opts = NULL; + const char *remote_ip = ssh_remote_ipaddr(ssh); + const char *remote_host = auth_get_canonical_hostname(ssh, + options.use_dns); if (authoptsp != NULL) *authoptsp = NULL; diff --git a/monitor.c b/monitor.c index 022126094..91e0e6245 100644 --- a/monitor.c +++ b/monitor.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.233 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.234 2022/06/15 16:08:25 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -1151,9 +1151,6 @@ mm_answer_keyallowed(struct ssh *ssh, int sock, struct sshbuf *m) u_int type = 0; int r, allowed = 0; struct sshauthopt *opts = NULL; - const char *remote_ip = ssh_remote_ipaddr(ssh); - const char *remote_host = auth_get_canonical_hostname(ssh, - options.use_dns); debug3_f("entering"); if ((r = sshbuf_get_u32(m, &type)) != 0 || @@ -1179,8 +1176,8 @@ mm_answer_keyallowed(struct ssh *ssh, int sock, struct sshbuf *m) if (!key_base_type_match(auth_method, key, options.pubkey_accepted_algos)) break; - allowed = user_key_allowed(authctxt->pw, key, - pubkey_auth_attempt, remote_ip, remote_host, &opts); + allowed = user_key_allowed(ssh, authctxt->pw, key, + pubkey_auth_attempt, &opts); break; case MM_HOSTKEY: auth_method = "hostbased"; diff --git a/monitor_wrap.c b/monitor_wrap.c index 925985a83..b2c85205e 100644 --- a/monitor_wrap.c +++ b/monitor_wrap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.c,v 1.124 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: monitor_wrap.c,v 1.125 2022/06/15 16:08:25 djm Exp $ */ /* * Copyright 2002 Niels Provos * Copyright 2002 Markus Friedl @@ -434,9 +434,8 @@ mm_auth_password(struct ssh *ssh, char *password) } int -mm_user_key_allowed(struct passwd *pw, struct sshkey *key, - int pubkey_auth_attempt, const char *remote_ip, const char *remote_host, - struct sshauthopt **authoptp) +mm_user_key_allowed(struct ssh *ssh, struct passwd *pw, struct sshkey *key, + int pubkey_auth_attempt, struct sshauthopt **authoptp) { return (mm_key_allowed(MM_USERKEY, NULL, NULL, key, pubkey_auth_attempt, authoptp)); diff --git a/monitor_wrap.h b/monitor_wrap.h index c5a75b9a3..0df49c25b 100644 --- a/monitor_wrap.h +++ b/monitor_wrap.h @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor_wrap.h,v 1.48 2022/05/27 05:01:25 djm Exp $ */ +/* $OpenBSD: monitor_wrap.h,v 1.49 2022/06/15 16:08:25 djm Exp $ */ /* * Copyright 2002 Niels Provos @@ -54,8 +54,8 @@ char *mm_auth2_read_banner(void); int mm_auth_password(struct ssh *, char *); int mm_key_allowed(enum mm_keytype, const char *, const char *, struct sshkey *, int, struct sshauthopt **); -int mm_user_key_allowed(struct passwd *, struct sshkey *, int, - const char *, const char *, struct sshauthopt **); +int mm_user_key_allowed(struct ssh *ssh, struct passwd *, struct sshkey *, int, + struct sshauthopt **); int mm_hostbased_key_allowed(struct ssh *, struct passwd *, const char *, const char *, struct sshkey *); int mm_sshkey_verify(const struct sshkey *, const u_char *, size_t, From 7d25b37fb2a5ff4dadabcbdac6087a97479434f5 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 24 Jun 2022 13:46:39 +1000 Subject: [PATCH 130/287] fix possible NULL deref when built without FIDO Analysis/fix from kircher in bz3443; ok dtucker@ --- ssh-sk.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssh-sk.c b/ssh-sk.c index a1ff5cc48..ba5146079 100644 --- a/ssh-sk.c +++ b/ssh-sk.c @@ -127,10 +127,11 @@ sshsk_open(const char *path) ret->sk_enroll = ssh_sk_enroll; ret->sk_sign = ssh_sk_sign; ret->sk_load_resident_keys = ssh_sk_load_resident_keys; + return ret; #else error("internal security key support not enabled"); + goto fail; #endif - return ret; } if ((ret->dlhandle = dlopen(path, RTLD_NOW)) == NULL) { error("Provider \"%s\" dlopen failed: %s", path, dlerror()); From 9c59e7486cc8691401228b43b96a3edbb06e0412 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 24 Jun 2022 14:20:43 +1000 Subject: [PATCH 131/287] automatically enable built-in FIDO support If libfido2 is found and usable, then enable the built-in security key support unless --without-security-key-builtin was requested. ok dtucker@ --- configure.ac | 65 +++++++++++++++++++++++++++------------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/configure.ac b/configure.ac index e7459ee1a..62c098d6d 100644 --- a/configure.ac +++ b/configure.ac @@ -54,6 +54,7 @@ AC_PATH_PROG([SH], [sh]) AC_PATH_PROG([GROFF], [groff]) AC_PATH_PROG([NROFF], [nroff awf]) AC_PATH_PROG([MANDOC], [mandoc]) +AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) AC_SUBST([TEST_SHELL], [sh]) dnl select manpage formatter to be used to build "cat" format pages. @@ -1666,7 +1667,6 @@ AC_ARG_WITH([libedit], [ --with-libedit[[=PATH]] Enable libedit support for sftp], [ if test "x$withval" != "xno" ; then if test "x$withval" = "xyes" ; then - AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) if test "x$PKGCONFIG" != "xno"; then AC_MSG_CHECKING([if $PKGCONFIG knows about libedit]) if "$PKGCONFIG" libedit; then @@ -2023,13 +2023,8 @@ AC_ARG_ENABLE([security-key], enable_sk_internal= AC_ARG_WITH([security-key-builtin], [ --with-security-key-builtin include builtin U2F/FIDO support], - [ - if test "x$withval" != "xno" ; then - enable_sk_internal=yes - fi - ] + [ enable_sk_internal=$withval ] ) -test "x$disable_sk" != "x" && enable_sk_internal="" AC_SEARCH_LIBS([dlopen], [dl]) AC_CHECK_FUNCS([dlopen]) @@ -3218,8 +3213,7 @@ fi AC_MSG_RESULT([$enable_sk]) # Now check for built-in security key support. -if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" = "xyes" ; then - AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) +if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" != "xno" ; then use_pkgconfig_for_libfido2= if test "x$PKGCONFIG" != "xno"; then AC_MSG_CHECKING([if $PKGCONFIG knows about libfido2]) @@ -3237,33 +3231,43 @@ if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" = "xyes" ; then LIBFIDO2="-lfido2 -lcbor" fi OTHERLIBS=`echo $LIBFIDO2 | sed 's/-lfido2//'` + fido2_error= AC_CHECK_LIB([fido2], [fido_init], - [ - AC_SUBST([LIBFIDO2]) - AC_DEFINE([ENABLE_SK_INTERNAL], [], - [Enable for built-in U2F/FIDO support]) - enable_sk="built-in" - ], [ AC_MSG_ERROR([no usable libfido2 found]) ], + [ ], + [ fido2_error="missing/unusable libfido2" ], [ $OTHERLIBS ] ) - saved_LIBS="$LIBS" - LIBS="$LIBS $LIBFIDO2" - AC_CHECK_FUNCS([ \ - fido_assert_set_clientdata \ - fido_cred_prot \ - fido_cred_set_prot \ - fido_cred_set_clientdata \ - fido_dev_get_touch_begin \ - fido_dev_get_touch_status \ - fido_dev_supports_cred_prot \ - ]) - LIBS="$saved_LIBS" AC_CHECK_HEADER([fido.h], [], - AC_MSG_ERROR([missing fido.h from libfido2])) + [ fido2_error="missing fido.h from libfido2" ]) AC_CHECK_HEADER([fido/credman.h], [], - AC_MSG_ERROR([missing fido/credman.h from libfido2]), - [#include ] + [ fido2_error="missing fido/credman.h from libfido2" ], + [ #include ] ) + AC_MSG_CHECKING([for usable libfido2 installation]) + if test ! -z "$fido2_error" ; then + AC_MSG_RESULT([$fido2_error]) + if test "x$enable_sk_internal" = "xyes" ; then + AC_MSG_ERROR([No usable libfido2 library/headers found]) + fi + else + AC_MSG_RESULT([yes]) + AC_SUBST([LIBFIDO2]) + AC_DEFINE([ENABLE_SK_INTERNAL], [], + [Enable for built-in U2F/FIDO support]) + enable_sk="built-in" + saved_LIBS="$LIBS" + LIBS="$LIBS $LIBFIDO2" + AC_CHECK_FUNCS([ \ + fido_assert_set_clientdata \ + fido_cred_prot \ + fido_cred_set_prot \ + fido_cred_set_clientdata \ + fido_dev_get_touch_begin \ + fido_dev_get_touch_status \ + fido_dev_supports_cred_prot \ + ]) + LIBS="$saved_LIBS" + fi fi AC_CHECK_FUNCS([ \ @@ -4667,7 +4671,6 @@ AC_ARG_WITH([kerberos5], AC_DEFINE([KRB5], [1], [Define if you want Kerberos 5 support]) KRB5_MSG="yes" - AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no]) use_pkgconfig_for_krb5= if test "x$PKGCONFIG" != "xno"; then AC_MSG_CHECKING([if $PKGCONFIG knows about kerberos5]) From ad1762173bb38716a106e8979806149fd0f2753e Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 17 Jun 2022 01:00:03 +0000 Subject: [PATCH 132/287] upstream: Log an error if pipe() fails while accepting a connection. bz#3447, from vincent-openssh at vinc17 net, ok djm@ OpenBSD-Commit-ID: 9d59f19872b94900a5c79da2d57850241ac5df94 --- sshd.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sshd.c b/sshd.c index 0ee65b54b..f494cdbbd 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.585 2022/03/18 04:04:11 djm Exp $ */ +/* $OpenBSD: sshd.c,v 1.586 2022/06/17 01:00:03 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1267,8 +1267,12 @@ server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s) usleep(100 * 1000); continue; } - if (unset_nonblock(*newsock) == -1 || - pipe(startup_p) == -1) { + if (unset_nonblock(*newsock) == -1) { + close(*newsock); + continue; + } + if (pipe(startup_p) == -1) { + error_f("pipe(startup_p): %s", strerror(errno)); close(*newsock); continue; } From f29d6cf98c25bf044079032d22c1a57c63ab9d8e Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Sat, 18 Jun 2022 02:17:16 +0000 Subject: [PATCH 133/287] upstream: Don't attempt to fprintf a null identity comment. From Martin Vahlensieck via tech@. OpenBSD-Commit-ID: 4c54d20a8e8e4e9912c38a7b4ef5bfc5ca2e05c2 --- ssh-add.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ssh-add.c b/ssh-add.c index 755547748..777f21e26 100644 --- a/ssh-add.c +++ b/ssh-add.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-add.c,v 1.165 2022/02/04 02:49:17 dtucker Exp $ */ +/* $OpenBSD: ssh-add.c,v 1.166 2022/06/18 02:17:16 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -125,7 +125,7 @@ delete_one(int agent_fd, const struct sshkey *key, const char *comment, } if (!qflag) { fprintf(stderr, "Identity removed: %s %s (%s)\n", path, - sshkey_type(key), comment); + sshkey_type(key), comment ? comment : "no comment"); } return 0; } @@ -399,7 +399,7 @@ add_file(int agent_fd, const char *filename, int key_only, int qflag, certpath, filename); sshkey_free(cert); goto out; - } + } /* Graft with private bits */ if ((r = sshkey_to_certified(private)) != 0) { From 17904f05802988d0bb9ed3c8d1d37411e8f459c3 Mon Sep 17 00:00:00 2001 From: "tobhe@openbsd.org" Date: Tue, 21 Jun 2022 14:52:13 +0000 Subject: [PATCH 134/287] upstream: Make sure not to fclose() the same fd twice in case of an error. ok dtucker@ OpenBSD-Commit-ID: e384c4e05d5521e7866b3d53ca59acd2a86eef99 --- authfile.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/authfile.c b/authfile.c index a399efc3e..9ed4f4c3a 100644 --- a/authfile.c +++ b/authfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: authfile.c,v 1.142 2022/01/01 01:55:30 jsg Exp $ */ +/* $OpenBSD: authfile.c,v 1.143 2022/06/21 14:52:13 tobhe Exp $ */ /* * Copyright (c) 2000, 2013 Markus Friedl. All rights reserved. * @@ -501,20 +501,25 @@ sshkey_save_public(const struct sshkey *key, const char *path, return SSH_ERR_SYSTEM_ERROR; if ((f = fdopen(fd, "w")) == NULL) { r = SSH_ERR_SYSTEM_ERROR; + close(fd); goto fail; } if ((r = sshkey_write(key, f)) != 0) goto fail; fprintf(f, " %s\n", comment); - if (ferror(f) || fclose(f) != 0) { + if (ferror(f)) { r = SSH_ERR_SYSTEM_ERROR; + goto fail; + } + if (fclose(f) != 0) { + r = SSH_ERR_SYSTEM_ERROR; + f = NULL; fail: - oerrno = errno; - if (f != NULL) + if (f != NULL) { + oerrno = errno; fclose(f); - else - close(fd); - errno = oerrno; + errno = oerrno; + } return r; } return 0; From 455cee8d6c2e4c48c5af9faead3599c49948411e Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 24 Jun 2022 04:27:14 +0000 Subject: [PATCH 135/287] upstream: make it clear that RekeyLimit applies to both transmitted and received data. GHPR#328 from Jan Pazdziora OpenBSD-Commit-ID: d180a905fec9ff418a75c07bb96ea41c9308c3f9 --- ssh_config.5 | 10 +++++----- sshd_config.5 | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ssh_config.5 b/ssh_config.5 index 052cc5c15..24a464600 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.372 2022/05/27 04:13:24 dtucker Exp $ -.Dd $Mdocdate: May 27 2022 $ +.\" $OpenBSD: ssh_config.5,v 1.373 2022/06/24 04:27:14 djm Exp $ +.Dd $Mdocdate: June 24 2022 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -1532,9 +1532,9 @@ extension required for restricted .Xr ssh-agent 1 forwarding. .It Cm RekeyLimit -Specifies the maximum amount of data that may be transmitted before the -session key is renegotiated, optionally followed by a maximum amount of -time that may pass before the session key is renegotiated. +Specifies the maximum amount of data that may be transmitted or received +before the session key is renegotiated, optionally followed by a maximum +amount of time that may pass before the session key is renegotiated. The first argument is specified in bytes and may have a suffix of .Sq K , .Sq M , diff --git a/sshd_config.5 b/sshd_config.5 index e33aedebb..867a747d6 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.341 2022/04/12 05:09:49 dtucker Exp $ -.Dd $Mdocdate: April 12 2022 $ +.\" $OpenBSD: sshd_config.5,v 1.342 2022/06/24 04:27:14 djm Exp $ +.Dd $Mdocdate: June 24 2022 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -1572,9 +1572,9 @@ Specifies whether public key authentication is allowed. The default is .Cm yes . .It Cm RekeyLimit -Specifies the maximum amount of data that may be transmitted before the -session key is renegotiated, optionally followed by a maximum amount of -time that may pass before the session key is renegotiated. +Specifies the maximum amount of data that may be transmitted or received +before the session key is renegotiated, optionally followed by a maximum +amount of time that may pass before the session key is renegotiated. The first argument is specified in bytes and may have a suffix of .Sq K , .Sq M , From f51423bdaf0008d46b6af082bcfd7a22a87375f0 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 24 Jun 2022 14:40:42 +1000 Subject: [PATCH 136/287] request 1.1x API compatibility for OpenSSL >=3.x idea/patch from Pedro Martelletto via GHPR#322; ok dtucker@ --- configure.ac | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 62c098d6d..116b9750d 100644 --- a/configure.ac +++ b/configure.ac @@ -2796,8 +2796,13 @@ if test "x$openssl" = "xyes" ; then ;; 101*) ;; # 1.1.x 200*) ;; # LibreSSL - 300*) ;; # OpenSSL 3 - 301*) ;; # OpenSSL development branch. + 300*) + # OpenSSL 3; we use the 1.1x API + CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" + ;; + 301*) + # OpenSSL development branch; request 1.1x API + CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" *) AC_MSG_ERROR([Unknown/unsupported OpenSSL version ("$ssl_library_ver")]) ;; From 5fd922ade1b25880fe8a8249f5c0385e413108f9 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 24 Jun 2022 14:43:54 +1000 Subject: [PATCH 137/287] fix broken case statement in previous --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 116b9750d..5d6cceafa 100644 --- a/configure.ac +++ b/configure.ac @@ -2803,6 +2803,7 @@ if test "x$openssl" = "xyes" ; then 301*) # OpenSSL development branch; request 1.1x API CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" + ;; *) AC_MSG_ERROR([Unknown/unsupported OpenSSL version ("$ssl_library_ver")]) ;; From 40f5d849d25c60b4ae21261e78484d435f5cfd51 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 25 Jun 2022 11:47:28 +1000 Subject: [PATCH 138/287] Disable SK support if FIDO libs not found. --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 5d6cceafa..016ff8435 100644 --- a/configure.ac +++ b/configure.ac @@ -3255,6 +3255,7 @@ if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" != "xno" ; then if test "x$enable_sk_internal" = "xyes" ; then AC_MSG_ERROR([No usable libfido2 library/headers found]) fi + enable_sk=no else AC_MSG_RESULT([yes]) AC_SUBST([LIBFIDO2]) From 193c6d8d905dde836b628fc07a7b9cf2d347e2a3 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 25 Jun 2022 12:16:15 +1000 Subject: [PATCH 139/287] Zero out LIBFIDO2 when SK support not usable. Prevents us from trying to link them into ssh-sk-helper and failing to build. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 016ff8435..1f9d23a30 100644 --- a/configure.ac +++ b/configure.ac @@ -3255,7 +3255,7 @@ if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" != "xno" ; then if test "x$enable_sk_internal" = "xyes" ; then AC_MSG_ERROR([No usable libfido2 library/headers found]) fi - enable_sk=no + LIBFIDO2="" else AC_MSG_RESULT([yes]) AC_SUBST([LIBFIDO2]) From 646686136c34c2dbf6a01296dfaa9ebee029386d Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 24 Jun 2022 04:37:00 +0000 Subject: [PATCH 140/287] upstream: Don't leak the strings allocated by order_hostkeyalgs() and list_hostkey_types() that are passed to compat_pkalg_proposal(). Part of github PR#324 from ZoltanFridrich, ok djm@ OpenBSD-Commit-ID: b2f6e5f60f2bba293b831654328a8a0035ef4a1b --- sshconnect2.c | 10 ++++++---- sshd.c | 8 ++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index b25225e64..583d292b3 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.356 2022/02/01 23:32:51 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.357 2022/06/24 04:37:00 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -114,6 +114,7 @@ first_alg(const char *algs) return ret; } +/* Returns an allocated string that the caller must free. */ static char * order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port, const struct ssh_conn_info *cinfo) @@ -217,7 +218,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, const struct ssh_conn_info *cinfo) { char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; - char *s, *all_key; + char *s, *all_key, *hostkeyalgs = NULL; int r, use_known_hosts_order = 0; xxx_host = host; @@ -255,9 +256,10 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; if (use_known_hosts_order) { /* Query known_hosts and prefer algorithms that appear there */ + hostkeyalgs = order_hostkeyalgs(host, hostaddr, port, cinfo); myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = - compat_pkalg_proposal(ssh, - order_hostkeyalgs(host, hostaddr, port, cinfo)); + compat_pkalg_proposal(ssh, hostkeyalgs); + free(hostkeyalgs); } else { /* Use specified HostkeyAlgorithms exactly */ myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = diff --git a/sshd.c b/sshd.c index f494cdbbd..747ba1f78 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.586 2022/06/17 01:00:03 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.587 2022/06/24 04:37:00 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -603,6 +603,7 @@ append_hostkey_type(struct sshbuf *b, const char *s) fatal_fr(r, "sshbuf_putf"); } +/* Returns an allocated string that the caller must free. */ static char * list_hostkey_types(void) { @@ -2367,6 +2368,7 @@ static void do_ssh2_kex(struct ssh *ssh) { char *myproposal[PROPOSAL_MAX] = { KEX_SERVER }; + char *hostkey_types = NULL; struct kex *kex; int r; @@ -2388,8 +2390,10 @@ do_ssh2_kex(struct ssh *ssh) ssh_packet_set_rekey_limits(ssh, options.rekey_limit, options.rekey_interval); + hostkey_types = list_hostkey_types(); myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = compat_pkalg_proposal( - ssh, list_hostkey_types()); + ssh, hostkey_types); + free(hostkey_types); /* start key exchange */ if ((r = kex_setup(ssh, myproposal)) != 0) From 2369a2810187e08f2af5d58b343956062fb96ee8 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 24 Jun 2022 10:45:06 +0000 Subject: [PATCH 141/287] upstream: Roll back previous KEX changes as they aren't safe until compat_pkalg_proposal and friends always allocate their returned strings. Reported by Qualys. OpenBSD-Commit-ID: 1c7a88a0d5033f42f88ab9bec58ef1cf72c81ad0 --- sshconnect2.c | 10 ++++------ sshd.c | 8 ++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index 583d292b3..5f87221b5 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.357 2022/06/24 04:37:00 dtucker Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.358 2022/06/24 10:45:06 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -114,7 +114,6 @@ first_alg(const char *algs) return ret; } -/* Returns an allocated string that the caller must free. */ static char * order_hostkeyalgs(char *host, struct sockaddr *hostaddr, u_short port, const struct ssh_conn_info *cinfo) @@ -218,7 +217,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, const struct ssh_conn_info *cinfo) { char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; - char *s, *all_key, *hostkeyalgs = NULL; + char *s, *all_key; int r, use_known_hosts_order = 0; xxx_host = host; @@ -256,10 +255,9 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; if (use_known_hosts_order) { /* Query known_hosts and prefer algorithms that appear there */ - hostkeyalgs = order_hostkeyalgs(host, hostaddr, port, cinfo); myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = - compat_pkalg_proposal(ssh, hostkeyalgs); - free(hostkeyalgs); + compat_pkalg_proposal(ssh, + order_hostkeyalgs(host, hostaddr, port, cinfo)); } else { /* Use specified HostkeyAlgorithms exactly */ myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = diff --git a/sshd.c b/sshd.c index 747ba1f78..d80b5e0ba 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.587 2022/06/24 04:37:00 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.588 2022/06/24 10:45:06 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -603,7 +603,6 @@ append_hostkey_type(struct sshbuf *b, const char *s) fatal_fr(r, "sshbuf_putf"); } -/* Returns an allocated string that the caller must free. */ static char * list_hostkey_types(void) { @@ -2368,7 +2367,6 @@ static void do_ssh2_kex(struct ssh *ssh) { char *myproposal[PROPOSAL_MAX] = { KEX_SERVER }; - char *hostkey_types = NULL; struct kex *kex; int r; @@ -2390,10 +2388,8 @@ do_ssh2_kex(struct ssh *ssh) ssh_packet_set_rekey_limits(ssh, options.rekey_limit, options.rekey_interval); - hostkey_types = list_hostkey_types(); myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = compat_pkalg_proposal( - ssh, hostkey_types); - free(hostkey_types); + ssh, list_hostkey_types()); /* start key exchange */ if ((r = kex_setup(ssh, myproposal)) != 0) From 2a822f29300b2de7335fbff65f0b187a0c582304 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 27 Jun 2022 21:41:55 +0000 Subject: [PATCH 142/287] upstream: allow arguments to sftp -D option, e.g. sftp -D "/usr/libexec/sftp-server -el debug3" ok markus@ OpenBSD-Commit-ID: 5a002b9f3a7aef2731fc0ffa9c921cf15f38ecce --- sftp.1 | 10 ++++++---- sftp.c | 16 +++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/sftp.1 b/sftp.1 index 39e7d6ed6..583a0ee1f 100644 --- a/sftp.1 +++ b/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.140 2022/03/31 17:27:27 naddy Exp $ +.\" $OpenBSD: sftp.1,v 1.141 2022/06/27 21:41:55 djm Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: March 31 2022 $ +.Dd $Mdocdate: June 27 2022 $ .Dt SFTP 1 .Os .Sh NAME @@ -34,7 +34,7 @@ .Op Fl B Ar buffer_size .Op Fl b Ar batchfile .Op Fl c Ar cipher -.Op Fl D Ar sftp_server_path +.Op Fl D Ar sftp_server_command .Op Fl F Ar ssh_config .Op Fl i Ar identity_file .Op Fl J Ar destination @@ -167,10 +167,12 @@ flag). Selects the cipher to use for encrypting the data transfers. This option is directly passed to .Xr ssh 1 . -.It Fl D Ar sftp_server_path +.It Fl D Ar sftp_server_command Connect directly to a local sftp server (rather than via .Xr ssh 1 ) . +A command and arguments may be specified, for example +.Qq /path/sftp-server -el debug3 . This option may be useful in debugging the client and server. .It Fl F Ar ssh_config Specifies an alternative diff --git a/sftp.c b/sftp.c index 41c7f1c9f..7297e77c1 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.216 2022/05/13 06:31:50 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.217 2022/06/27 21:41:55 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -2387,8 +2387,8 @@ usage(void) int main(int argc, char **argv) { - int in, out, ch, err, tmp, port = -1, noisy = 0; - char *host = NULL, *user, *cp, *file2 = NULL; + int r, in, out, ch, err, tmp, port = -1, noisy = 0; + char *host = NULL, *user, *cp, **cpp, *file2 = NULL; int debug_level = 0; char *file1 = NULL, *sftp_server = NULL; char *ssh_program = _PATH_SSH_PROGRAM, *sftp_direct = NULL; @@ -2586,10 +2586,12 @@ main(int argc, char **argv) connect_to_server(ssh_program, args.list, &in, &out); } else { - args.list = NULL; - addargs(&args, "sftp-server"); - - connect_to_server(sftp_direct, args.list, &in, &out); + if ((r = argv_split(sftp_direct, &tmp, &cpp, 1)) != 0) + fatal_r(r, "Parse -D arguments"); + if (cpp[0] == 0) + fatal("No sftp server specified via -D"); + connect_to_server(cpp[0], cpp, &in, &out); + argv_free(cpp, tmp); } freeargs(&args); From c71a1442d02f0a3586109dfe2cb366de36dee08e Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 29 Jun 2022 18:28:47 +1000 Subject: [PATCH 143/287] Update OpenSSL tests to the most recent releases. --- .github/workflows/c-cpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 49da0f4a6..91698fe19 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -58,9 +58,9 @@ jobs: - { os: ubuntu-latest, configs: openssl-1.1.1 } - { os: ubuntu-latest, configs: openssl-1.1.1k } - { os: ubuntu-latest, configs: openssl-1.1.1n } - - { os: ubuntu-latest, configs: openssl-1.1.1o } + - { os: ubuntu-latest, configs: openssl-1.1.1p } - { os: ubuntu-latest, configs: openssl-3.0.0 } - - { os: ubuntu-latest, configs: openssl-3.0.3 } + - { os: ubuntu-latest, configs: openssl-3.0.4 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - { os: ubuntu-18.04, configs: pam } From 33efac790f6b09d54894ba6c3e17dfb08b6fc7e1 Mon Sep 17 00:00:00 2001 From: "jmc@openbsd.org" Date: Tue, 28 Jun 2022 06:09:14 +0000 Subject: [PATCH 144/287] upstream: reflect the update to -D arg name in usage(); OpenBSD-Commit-ID: abdcde4f92b1ef094ae44210ee99d3b0155aad9c --- sftp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sftp.c b/sftp.c index 7297e77c1..c880f1661 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.217 2022/06/27 21:41:55 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.218 2022/06/28 06:09:14 jmc Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -2376,7 +2376,7 @@ usage(void) fprintf(stderr, "usage: %s [-46AaCfNpqrv] [-B buffer_size] [-b batchfile] [-c cipher]\n" - " [-D sftp_server_path] [-F ssh_config] [-i identity_file]\n" + " [-D sftp_server_command] [-F ssh_config] [-i identity_file]\n" " [-J destination] [-l limit] [-o ssh_option] [-P port]\n" " [-R num_requests] [-S program] [-s subsystem | sftp_server]\n" " destination\n", From 96faa0de6c673a2ce84736eba37fc9fb723d9e5c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 1 Jul 2022 00:36:30 +0000 Subject: [PATCH 145/287] upstream: ignore SIGPIPE earlier in main(), specifically before muxclient() which performs operations that could cause one; Reported by Noam Lewis via bz3454, ok dtucker@ OpenBSD-Commit-ID: 63d8e13276869eebac6d7a05d5a96307f9026e47 --- ssh.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ssh.c b/ssh.c index 89ca1940c..559bf2aff 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.574 2022/03/30 04:33:09 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.575 2022/07/01 00:36:30 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1124,6 +1124,8 @@ main(int ac, char **av) } } + ssh_signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE early */ + /* * Initialize "log" output. Since we are the client all output * goes to stderr unless otherwise specified by -y or -E. @@ -1652,7 +1654,6 @@ main(int ac, char **av) options.num_system_hostfiles); tilde_expand_paths(options.user_hostfiles, options.num_user_hostfiles); - ssh_signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE early */ ssh_signal(SIGCHLD, main_sigchld_handler); /* Log into the remote system. Never returns if the login fails. */ From 486c4dc3b83b4b67d663fb0fa62bc24138ec3946 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 1 Jul 2022 03:35:45 +0000 Subject: [PATCH 146/287] upstream: Always return allocated strings from the kex filtering so that we can free them later. Fix one leak in compat_kex_proposal. Based on github PR#324 from ZoltanFridrich with some simplications by me. ok djm@ OpenBSD-Commit-ID: 9171616da3307612d0ede086fd511142f91246e4 --- compat.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/compat.c b/compat.c index 0dbea68c6..46dfe3a9c 100644 --- a/compat.c +++ b/compat.c @@ -1,4 +1,4 @@ -/* $OpenBSD: compat.c,v 1.119 2021/09/10 05:46:09 djm Exp $ */ +/* $OpenBSD: compat.c,v 1.120 2022/07/01 03:35:45 dtucker Exp $ */ /* * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. * @@ -156,11 +156,12 @@ compat_banner(struct ssh *ssh, const char *version) debug_f("no match: %s", version); } +/* Always returns pointer to allocated memory, caller must free. */ char * compat_cipher_proposal(struct ssh *ssh, char *cipher_prop) { if (!(ssh->compat & SSH_BUG_BIGENDIANAES)) - return cipher_prop; + return xstrdup(cipher_prop); debug2_f("original cipher proposal: %s", cipher_prop); if ((cipher_prop = match_filter_denylist(cipher_prop, "aes*")) == NULL) fatal("match_filter_denylist failed"); @@ -170,11 +171,12 @@ compat_cipher_proposal(struct ssh *ssh, char *cipher_prop) return cipher_prop; } +/* Always returns pointer to allocated memory, caller must free. */ char * compat_pkalg_proposal(struct ssh *ssh, char *pkalg_prop) { if (!(ssh->compat & SSH_BUG_RSASIGMD5)) - return pkalg_prop; + return xstrdup(pkalg_prop); debug2_f("original public key proposal: %s", pkalg_prop); if ((pkalg_prop = match_filter_denylist(pkalg_prop, "ssh-rsa")) == NULL) fatal("match_filter_denylist failed"); @@ -184,21 +186,26 @@ compat_pkalg_proposal(struct ssh *ssh, char *pkalg_prop) return pkalg_prop; } +/* Always returns pointer to allocated memory, caller must free. */ char * compat_kex_proposal(struct ssh *ssh, char *p) { + char *cp = NULL; + if ((ssh->compat & (SSH_BUG_CURVE25519PAD|SSH_OLD_DHGEX)) == 0) - return p; + return xstrdup(p); debug2_f("original KEX proposal: %s", p); if ((ssh->compat & SSH_BUG_CURVE25519PAD) != 0) if ((p = match_filter_denylist(p, "curve25519-sha256@libssh.org")) == NULL) fatal("match_filter_denylist failed"); if ((ssh->compat & SSH_OLD_DHGEX) != 0) { + cp = p; if ((p = match_filter_denylist(p, "diffie-hellman-group-exchange-sha256," "diffie-hellman-group-exchange-sha1")) == NULL) fatal("match_filter_denylist failed"); + free(cp); } debug2_f("compat KEX proposal: %s", p); if (*p == '\0') From 6c31ba10e97b6953c4f325f526f3e846dfea647a Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 1 Jul 2022 03:39:44 +0000 Subject: [PATCH 147/287] upstream: Don't leak the strings allocated by order_hostkeyalgs() and list_hostkey_types() that are passed to compat_pkalg_proposal(). Part of github PR#324 from ZoltanFridrich, ok djm@ This is a roll-forward of the previous rollback now that the required changes in compat.c have been done. OpenBSD-Commit-ID: c7cd93730b3b9f53cdad3ae32462922834ef73eb --- sshconnect2.c | 16 ++++++++++------ sshd.c | 17 +++++++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index 5f87221b5..7fd5c2189 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.358 2022/06/24 10:45:06 dtucker Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.359 2022/07/01 03:39:44 dtucker Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -218,6 +218,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, { char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; char *s, *all_key; + char *prop_kex = NULL, *prop_enc = NULL, *prop_hostkey = NULL; int r, use_known_hosts_order = 0; xxx_host = host; @@ -243,10 +244,9 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, if ((s = kex_names_cat(options.kex_algorithms, "ext-info-c")) == NULL) fatal_f("kex_names_cat"); - myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(ssh, s); + myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh, s); myproposal[PROPOSAL_ENC_ALGS_CTOS] = - compat_cipher_proposal(ssh, options.ciphers); - myproposal[PROPOSAL_ENC_ALGS_STOC] = + myproposal[PROPOSAL_ENC_ALGS_STOC] = prop_enc = compat_cipher_proposal(ssh, options.ciphers); myproposal[PROPOSAL_COMP_ALGS_CTOS] = myproposal[PROPOSAL_COMP_ALGS_STOC] = @@ -255,12 +255,12 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; if (use_known_hosts_order) { /* Query known_hosts and prefer algorithms that appear there */ - myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = + myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = prop_hostkey = compat_pkalg_proposal(ssh, order_hostkeyalgs(host, hostaddr, port, cinfo)); } else { /* Use specified HostkeyAlgorithms exactly */ - myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = + myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = prop_hostkey = compat_pkalg_proposal(ssh, options.hostkeyalgorithms); } @@ -303,6 +303,10 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, (r = ssh_packet_write_wait(ssh)) != 0) fatal_fr(r, "send packet"); #endif + /* Free only parts of proposal that were dynamically allocated here. */ + free(prop_kex); + free(prop_enc); + free(prop_hostkey); } /* diff --git a/sshd.c b/sshd.c index d80b5e0ba..e0680d3f5 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.588 2022/06/24 10:45:06 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.589 2022/07/01 03:39:44 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2368,12 +2368,14 @@ do_ssh2_kex(struct ssh *ssh) { char *myproposal[PROPOSAL_MAX] = { KEX_SERVER }; struct kex *kex; + char *prop_kex = NULL, *prop_enc = NULL, *prop_hostkey = NULL; int r; - myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(ssh, + myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh, options.kex_algorithms); - myproposal[PROPOSAL_ENC_ALGS_CTOS] = compat_cipher_proposal(ssh, - options.ciphers); + myproposal[PROPOSAL_ENC_ALGS_CTOS] = + myproposal[PROPOSAL_ENC_ALGS_STOC] = prop_enc = + compat_cipher_proposal(ssh, options.ciphers); myproposal[PROPOSAL_ENC_ALGS_STOC] = compat_cipher_proposal(ssh, options.ciphers); myproposal[PROPOSAL_MAC_ALGS_CTOS] = @@ -2388,8 +2390,8 @@ do_ssh2_kex(struct ssh *ssh) ssh_packet_set_rekey_limits(ssh, options.rekey_limit, options.rekey_interval); - myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = compat_pkalg_proposal( - ssh, list_hostkey_types()); + myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = prop_hostkey = + compat_pkalg_proposal(ssh, list_hostkey_types()); /* start key exchange */ if ((r = kex_setup(ssh, myproposal)) != 0) @@ -2424,6 +2426,9 @@ do_ssh2_kex(struct ssh *ssh) (r = ssh_packet_write_wait(ssh)) != 0) fatal_fr(r, "send test"); #endif + free(prop_kex); + free(prop_enc); + free(prop_hostkey); debug("KEX done"); } From 4be7184ebe2a2ccef175983517a35ee06766e1b4 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 1 Jul 2022 03:52:57 +0000 Subject: [PATCH 148/287] upstream: bump up loglevel from debug to info when unable to open authorized keys/principals file for errno != ENOENT; bz2042 ok dtucker OpenBSD-Commit-ID: e79aa550d91ade6a80f081bda689da24c086d66b --- auth2-pubkeyfile.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c index 911f01baf..0cfacac35 100644 --- a/auth2-pubkeyfile.c +++ b/auth2-pubkeyfile.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkeyfile.c,v 1.2 2022/06/03 04:47:21 djm Exp $ */ +/* $OpenBSD: auth2-pubkeyfile.c,v 1.3 2022/07/01 03:52:57 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -449,9 +449,13 @@ auth_openfile(const char *file, struct passwd *pw, int strict_modes, FILE *f; if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) { - if (log_missing || errno != ENOENT) - debug("Could not open %s '%s': %s", file_type, file, - strerror(errno)); + if (errno != ENOENT) { + logit("Could not open user '%s' %s '%s': %s", + pw->pw_name, file_type, file, strerror(errno)); + } else if (log_missing) { + debug("Could not open user '%s' %s '%s': %s", + pw->pw_name, file_type, file, strerror(errno)); + } return NULL; } @@ -460,7 +464,7 @@ auth_openfile(const char *file, struct passwd *pw, int strict_modes, return NULL; } if (!S_ISREG(st.st_mode)) { - logit("User %s %s %s is not a regular file", + logit("User '%s' %s '%s' is not a regular file", pw->pw_name, file_type, file); close(fd); return NULL; From 32e82a392d9f263485effdd606ff5862d289a4a0 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 1 Jul 2022 13:55:19 +1000 Subject: [PATCH 149/287] Skip select+rlimit check if sandboxing is disabled It's not needed in that case, and the test can fail when being built with some compiler memory sanitizer flags. bz#3441 --- configure.ac | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 1f9d23a30..0aba3709f 100644 --- a/configure.ac +++ b/configure.ac @@ -3552,10 +3552,13 @@ AC_ARG_WITH([sandbox], # POSIX specifies that poll() "shall fail with EINVAL if the nfds argument # is greater than OPEN_MAX". On some platforms that includes implementions -# ofselect in userspace on top of poll() so check both work with rlimit NOFILES -# so check that both work before enabling the rlimit sandbox. +# of select in userspace on top of poll() so check both work with rlimit +# NOFILES so check that both work before enabling the rlimit sandbox. AC_MSG_CHECKING([if select and/or poll works with descriptor rlimit]) -AC_RUN_IFELSE( +if test "x$sandbox_arg" = "xno"; then + AC_MSG_RESULT([sandboxing disabled, skipping]) +else + AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include #ifdef HAVE_SYS_TIME_H @@ -3608,7 +3611,8 @@ AC_RUN_IFELSE( select_works_with_rlimit=no], [AC_MSG_WARN([cross compiling: assuming no]) select_works_with_rlimit=no] -) + ) +fi AC_CHECK_MEMBERS([struct pollfd.fd], [], [], [[ #include From 7ec81daad0e03a64e8d91c5590960c48c1a899a3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 1 Jul 2022 04:45:50 +0000 Subject: [PATCH 150/287] upstream: use consistent field names (s/char/byte) in format description OpenBSD-Commit-ID: 3de33572733ee7fcfd7db33d37db23d2280254f0 --- PROTOCOL.key | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PROTOCOL.key b/PROTOCOL.key index 38df268b6..cbf7a7027 100644 --- a/PROTOCOL.key +++ b/PROTOCOL.key @@ -11,7 +11,7 @@ an encrypted list of matching private keys. string ciphername string kdfname string kdfoptions - int number of keys N + uint32 number of keys N string publickey1 string publickey2 ... @@ -42,11 +42,11 @@ of the cipher block size. ... string privatekeyN string commentN - char 1 - char 2 - char 3 + byte 1 + byte 2 + byte 3 ... - char padlen % 255 + byte padlen % 255 where each private key is encoded using the same rules as used for SSH agent. @@ -68,4 +68,4 @@ For unencrypted keys the cipher "none" and the KDF "none" are used with empty passphrases. The options if the KDF "none" are the empty string. -$OpenBSD: PROTOCOL.key,v 1.2 2021/05/07 02:29:40 djm Exp $ +$OpenBSD: PROTOCOL.key,v 1.3 2022/07/01 04:45:50 djm Exp $ From 322964f8f2e9c321e77ebae1e4d2cd0ccc5c5a0b Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 1 Jul 2022 05:08:23 +0000 Subject: [PATCH 151/287] upstream: Remove leftover line. Remove extra line leftover from merge conflict. ok djm@ OpenBSD-Commit-ID: 460e2290875d7ae64971a7e669c244b1d1c0ae2e --- sshd.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sshd.c b/sshd.c index e0680d3f5..17eee9d83 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.589 2022/07/01 03:39:44 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.590 2022/07/01 05:08:23 dtucker Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -2376,8 +2376,6 @@ do_ssh2_kex(struct ssh *ssh) myproposal[PROPOSAL_ENC_ALGS_CTOS] = myproposal[PROPOSAL_ENC_ALGS_STOC] = prop_enc = compat_cipher_proposal(ssh, options.ciphers); - myproposal[PROPOSAL_ENC_ALGS_STOC] = compat_cipher_proposal(ssh, - options.ciphers); myproposal[PROPOSAL_MAC_ALGS_CTOS] = myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; From 6208d611520f9ea94d5369f9da404b709930029d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sun, 3 Jul 2022 17:54:49 +1000 Subject: [PATCH 152/287] Move checks for pollfd.fd and nfds_t. Move the checks for struct pollfd.fd and nfds_t to before the sandboxing checks. This groups all the sandbox checks together so we can skip them all when sandboxing is disabled. --- configure.ac | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/configure.ac b/configure.ac index 0aba3709f..d371d408c 100644 --- a/configure.ac +++ b/configure.ac @@ -3537,6 +3537,26 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ ) fi +AC_CHECK_MEMBERS([struct pollfd.fd], [], [], [[ +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif +]]) + +AC_CHECK_TYPES([nfds_t], , , [ +#include +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif +]) + # Decide which sandbox style to use sandbox_arg="" AC_ARG_WITH([sandbox], @@ -3614,26 +3634,6 @@ else ) fi -AC_CHECK_MEMBERS([struct pollfd.fd], [], [], [[ -#include -#ifdef HAVE_POLL_H -#include -#endif -#ifdef HAVE_SYS_POLL_H -#include -#endif -]]) - -AC_CHECK_TYPES([nfds_t], , , [ -#include -#ifdef HAVE_POLL_H -#include -#endif -#ifdef HAVE_SYS_POLL_H -#include -#endif -]) - AC_MSG_CHECKING([if setrlimit(RLIMIT_NOFILE,{0,0}) works]) AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ From bfce0e66b6017a9bfab450b9dc7d4b16f90de817 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sun, 3 Jul 2022 18:14:09 +1000 Subject: [PATCH 153/287] Skip all rlimit tests when sandboxing disabled. The rlimit tests can hang when being run with some compiler sanitizers so skip all of them if sandbox=no. --- configure.ac | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index d371d408c..a0ff6f0b3 100644 --- a/configure.ac +++ b/configure.ac @@ -3570,14 +3570,12 @@ AC_ARG_WITH([sandbox], ] ) +if test "x$sandbox_arg" != "xno"; then # POSIX specifies that poll() "shall fail with EINVAL if the nfds argument # is greater than OPEN_MAX". On some platforms that includes implementions # of select in userspace on top of poll() so check both work with rlimit # NOFILES so check that both work before enabling the rlimit sandbox. -AC_MSG_CHECKING([if select and/or poll works with descriptor rlimit]) -if test "x$sandbox_arg" = "xno"; then - AC_MSG_RESULT([sandboxing disabled, skipping]) -else + AC_MSG_CHECKING([if select and/or poll works with descriptor rlimit]) AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include @@ -3632,10 +3630,9 @@ else [AC_MSG_WARN([cross compiling: assuming no]) select_works_with_rlimit=no] ) -fi -AC_MSG_CHECKING([if setrlimit(RLIMIT_NOFILE,{0,0}) works]) -AC_RUN_IFELSE( + AC_MSG_CHECKING([if setrlimit(RLIMIT_NOFILE,{0,0}) works]) + AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include #ifdef HAVE_SYS_TIME_H @@ -3658,10 +3655,10 @@ AC_RUN_IFELSE( rlimit_nofile_zero_works=no], [AC_MSG_WARN([cross compiling: assuming yes]) rlimit_nofile_zero_works=yes] -) + ) -AC_MSG_CHECKING([if setrlimit RLIMIT_FSIZE works]) -AC_RUN_IFELSE( + AC_MSG_CHECKING([if setrlimit RLIMIT_FSIZE works]) + AC_RUN_IFELSE( [AC_LANG_PROGRAM([[ #include #include @@ -3677,7 +3674,8 @@ AC_RUN_IFELSE( AC_DEFINE(SANDBOX_SKIP_RLIMIT_FSIZE, 1, [setrlimit RLIMIT_FSIZE works])], [AC_MSG_WARN([cross compiling: assuming yes])] -) + ) +fi if test "x$sandbox_arg" = "xpledge" || \ ( test -z "$sandbox_arg" && test "x$ac_cv_func_pledge" = "xyes" ) ; then From 7394ed80c4de8b228a43c8956cf2fa1b9c6b2622 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sun, 3 Jul 2022 21:46:44 +1000 Subject: [PATCH 154/287] Add clang sanitizer tests. --- .github/configs | 45 ++++++++++++++++++++++++++++++++++++- .github/setup_ci.sh | 3 +++ .github/workflows/c-cpp.yml | 5 +++++ openbsd-compat/bsd-misc.c | 12 ++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) diff --git a/.github/configs b/.github/configs index 871a3d414..d0ed73953 100755 --- a/.github/configs +++ b/.github/configs @@ -17,6 +17,7 @@ SUDO=sudo # run with sudo by default TEST_SSH_UNSAFE_PERMISSIONS=1 # Stop on first test failure to minimize logs TEST_SSH_FAIL_FATAL=yes +unset CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO CONFIGFLAGS="" LIBCRYPTOFLAGS="" @@ -41,6 +42,48 @@ case "$config" in CFLAGS="-Wall -Wextra -O2 -Wno-error=implicit-fallthrough -Wno-error=unused-parameter" CONFIGFLAGS="--with-pam --with-Werror" ;; + clang-sanitize-*) + # - We replace chroot with chdir so that the sanitizer in the preauth + # privsep process can read /proc. + # - clang does not recognizes explicit_bzero so we use bzero + # (see https://github.com/google/sanitizers/issues/1507 + # - openssl and zlib trip ASAN. + # - sp_pwdp returned by getspnam trips ASAN, hence disabling shadow. + case "$config" in + clang-sanitize-address) + CFLAGS="-fsanitize=address -fno-omit-frame-pointer" + LDFLAGS="-fsanitize=address" + CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DASAN_OPTIONS=\"detect_leaks=0:log_path=/tmp/asan.log\"' + CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" + TEST_TARGET="t-exec" + ;; + clang-sanitize-memory) + CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins" + LDFLAGS="-fsanitize=memory" + CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DMSAN_OPTIONS=\"log_path=/tmp/msan.log\"' + CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" + TEST_TARGET="t-exec" + ;; + clang-sanitize-undefined) + CFLAGS="-fsanitize=undefined" + LDFLAGS="-fsanitize=undefined" + ;; + *) + echo unknown sanitize option; + exit 1;; + esac + # Find the newest available version of clang + for i in `seq 10 99`; do + clang=$(which clang-$i 2>/dev/null) + [ -x "$clang" ] && CC="$clang" + done + features="--disable-security-key --disable-pkcs11" + hardening="--without-sandbox --without-hardening --without-stackprotect" + privsep="--with-privsep-user=root" + CONFIGFLAGS="$CONFIGFLAGS $features $hardening $privsep" + # Because we hobble chroot we can't test it. + SKIP_LTESTS=sftp-chroot + ;; gcc-11-Werror) CC="gcc" # -Wnoformat-truncation in gcc 7.3.1 20180130 fails on fmt_scaled @@ -227,5 +270,5 @@ if [ -x "$(which plink 2>/dev/null)" ]; then export REGRESS_INTEROP_PUTTY fi -export CC CFLAGS LTESTS SUDO +export CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO export TEST_TARGET TEST_SSH_UNSAFE_PERMISSIONS TEST_SSH_FAIL_FATAL diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index a3bb8587e..cd8b72d20 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -37,6 +37,9 @@ for TARGET in $TARGETS; do default|without-openssl|without-zlib|c89|libedit|*pam) # nothing to do ;; + clang-sanitize*) + PACKAGES="$PACKAGES clang-12" + ;; clang-*|gcc-*) compiler=$(echo $TARGET | sed 's/-Werror//') PACKAGES="$PACKAGES $compiler" diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 91698fe19..c8b8dbcd6 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -32,6 +32,9 @@ jobs: - { os: ubuntu-20.04, configs: clang-10 } - { os: ubuntu-20.04, configs: clang-11 } - { os: ubuntu-20.04, configs: clang-12-Werror } + - { os: ubuntu-20.04, configs: clang-sanitize-address } + - { os: ubuntu-20.04, configs: clang-sanitize-memory } + - { os: ubuntu-20.04, configs: clang-sanitize-undefined } - { os: ubuntu-20.04, configs: gcc-7 } - { os: ubuntu-20.04, configs: gcc-8 } - { os: ubuntu-20.04, configs: gcc-10 } @@ -106,3 +109,5 @@ jobs: config.log regress/*.log regress/valgrind-out/ + /tmp/asan.log.* + /tnp/msan.log.* diff --git a/openbsd-compat/bsd-misc.c b/openbsd-compat/bsd-misc.c index 3b00ef6d2..226a5915b 100644 --- a/openbsd-compat/bsd-misc.c +++ b/openbsd-compat/bsd-misc.c @@ -446,3 +446,15 @@ localtime_r(const time_t *timep, struct tm *result) return result; } #endif + +#ifdef ASAN_OPTIONS +const char *__asan_default_options(void) { + return ASAN_OPTIONS; +} +#endif + +#ifdef MSAN_OPTIONS +const char *__msan_default_options(void) { + return MSAN_OPTIONS; +} +#endif From 35ef2b3b6ef198f8574904a45780487ec2f17858 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 4 Jul 2022 09:10:31 +0000 Subject: [PATCH 155/287] upstream: Add TEST_REGRESS_CACHE_DIR. If set, it is used to cache regress test names that have succeeded and skip those on a re-run. OpenBSD-Regress-ID: a7570dd29a58df59f2cca647c3c2ec989b49f247 --- regress/test-exec.sh | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/regress/test-exec.sh b/regress/test-exec.sh index 9fb02d1cb..45b11734e 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -1,4 +1,4 @@ -# $OpenBSD: test-exec.sh,v 1.89 2022/01/06 22:14:25 dtucker Exp $ +# $OpenBSD: test-exec.sh,v 1.90 2022/07/04 09:10:31 dtucker Exp $ # Placed in the Public Domain. #SUDO=sudo @@ -250,6 +250,30 @@ if [ "x$TEST_REGRESS_LOGFILE" = "x" ]; then TEST_REGRESS_LOGFILE=$OBJ/regress.log fi +# If set, keep track of successful tests and skip them them if we've +# previously completed that test. +if [ "x$TEST_REGRESS_CACHE_DIR" != "x" ]; then + if [ ! -d "$TEST_REGRESS_CACHE_DIR" ]; then + mkdir -p "$TEST_REGRESS_CACHE_DIR" + fi + TEST="`basename $SCRIPT .sh`" + CACHE="${TEST_REGRESS_CACHE_DIR}/${TEST}.cache" + for i in ${SSH} ${SSHD} ${SSHAGENT} ${SSHADD} ${SSHKEYGEN} ${SCP} \ + ${SFTP} ${SFTPSERVER} ${SSHKEYSCAN}; do + case $i in + /*) bin="$i" ;; + *) bin="`which $i`" ;; + esac + if [ "$bin" -nt "$CACHE" ]; then + rm -f "$CACHE" + fi + done + if [ -f "$CACHE" ]; then + echo ok cached $CACHE + exit 0 + fi +fi + # truncate logfiles >$TEST_SSH_LOGFILE >$TEST_SSHD_LOGFILE @@ -763,6 +787,9 @@ fi if [ $RESULT -eq 0 ]; then verbose ok $tid + if [ "x$CACHE" != "x" ]; then + touch "$CACHE" + fi else echo failed $tid fi From 55c60bdd39b82457e92efa77da8d16cfa6a49391 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 5 Jul 2022 12:02:33 +1000 Subject: [PATCH 156/287] Move sanitizer logs into regress for collection. --- .github/configs | 6 ++++-- .github/workflows/c-cpp.yml | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/configs b/.github/configs index d0ed73953..7ebb832ee 100755 --- a/.github/configs +++ b/.github/configs @@ -43,6 +43,8 @@ case "$config" in CONFIGFLAGS="--with-pam --with-Werror" ;; clang-sanitize-*) + # Put Sanitizer logs in regress dir. + SANLOGS=`pwd`/regress # - We replace chroot with chdir so that the sanitizer in the preauth # privsep process can read /proc. # - clang does not recognizes explicit_bzero so we use bzero @@ -53,14 +55,14 @@ case "$config" in clang-sanitize-address) CFLAGS="-fsanitize=address -fno-omit-frame-pointer" LDFLAGS="-fsanitize=address" - CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DASAN_OPTIONS=\"detect_leaks=0:log_path=/tmp/asan.log\"' + CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DASAN_OPTIONS=\"detect_leaks=0:log_path='$SANLOGS'/asan.log\"' CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" TEST_TARGET="t-exec" ;; clang-sanitize-memory) CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins" LDFLAGS="-fsanitize=memory" - CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DMSAN_OPTIONS=\"log_path=/tmp/msan.log\"' + CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DMSAN_OPTIONS=\"log_path='$SANLOGS'/msan.log\"' CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" TEST_TARGET="t-exec" ;; diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index c8b8dbcd6..a190a9d0b 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -109,5 +109,5 @@ jobs: config.log regress/*.log regress/valgrind-out/ - /tmp/asan.log.* - /tnp/msan.log.* + regress/asan.log.* + regress/msan.log.* From 48cc68b69118b3ce8d07fd4f82e00d58667d5379 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 5 Jul 2022 16:23:28 +1000 Subject: [PATCH 157/287] Add GCC address sanitizer build/test. --- .github/configs | 25 ++++++++++++++++--------- .github/setup_ci.sh | 2 ++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/.github/configs b/.github/configs index 7ebb832ee..ebbfa5b49 100755 --- a/.github/configs +++ b/.github/configs @@ -42,7 +42,19 @@ case "$config" in CFLAGS="-Wall -Wextra -O2 -Wno-error=implicit-fallthrough -Wno-error=unused-parameter" CONFIGFLAGS="--with-pam --with-Werror" ;; - clang-sanitize-*) + *-sanitize-*) + case "$config" in + gcc-*) + CC=gcc + ;; + clang-*) + # Find the newest available version of clang + for i in `seq 10 99`; do + clang="`which clang-$i 2>/dev/null`" + [ -x "$clang" ] && CC="$clang" + done + ;; + esac # Put Sanitizer logs in regress dir. SANLOGS=`pwd`/regress # - We replace chroot with chdir so that the sanitizer in the preauth @@ -52,11 +64,11 @@ case "$config" in # - openssl and zlib trip ASAN. # - sp_pwdp returned by getspnam trips ASAN, hence disabling shadow. case "$config" in - clang-sanitize-address) + *-sanitize-address) CFLAGS="-fsanitize=address -fno-omit-frame-pointer" LDFLAGS="-fsanitize=address" - CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DASAN_OPTIONS=\"detect_leaks=0:log_path='$SANLOGS'/asan.log\"' - CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" + CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -D_FORTIFY_SOURCE=0 -DASAN_OPTIONS=\"detect_leaks=0:log_path='$SANLOGS'/asan.log\"' + CONFIGFLAGS="" TEST_TARGET="t-exec" ;; clang-sanitize-memory) @@ -74,11 +86,6 @@ case "$config" in echo unknown sanitize option; exit 1;; esac - # Find the newest available version of clang - for i in `seq 10 99`; do - clang=$(which clang-$i 2>/dev/null) - [ -x "$clang" ] && CC="$clang" - done features="--disable-security-key --disable-pkcs11" hardening="--without-sandbox --without-hardening --without-stackprotect" privsep="--with-privsep-user=root" diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index cd8b72d20..fe5e13ff0 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -40,6 +40,8 @@ for TARGET in $TARGETS; do clang-sanitize*) PACKAGES="$PACKAGES clang-12" ;; + gcc-sanitize*) + ;; clang-*|gcc-*) compiler=$(echo $TARGET | sed 's/-Werror//') PACKAGES="$PACKAGES $compiler" From 669a56bcfe73f8b985f2bba476ba834d55253acf Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 5 Jul 2022 18:35:53 +1000 Subject: [PATCH 158/287] Update sanitizer test targets: - remove clang-sanitize-memory for now. It takes so long that the test times out. - add gcc sanitize-address and sanitize-undefined test targets. --- .github/configs | 2 +- .github/workflows/c-cpp.yml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/configs b/.github/configs index ebbfa5b49..0308ca6c1 100755 --- a/.github/configs +++ b/.github/configs @@ -78,7 +78,7 @@ case "$config" in CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" TEST_TARGET="t-exec" ;; - clang-sanitize-undefined) + *-sanitize-undefined) CFLAGS="-fsanitize=undefined" LDFLAGS="-fsanitize=undefined" ;; diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index a190a9d0b..9f918b950 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -33,8 +33,9 @@ jobs: - { os: ubuntu-20.04, configs: clang-11 } - { os: ubuntu-20.04, configs: clang-12-Werror } - { os: ubuntu-20.04, configs: clang-sanitize-address } - - { os: ubuntu-20.04, configs: clang-sanitize-memory } - { os: ubuntu-20.04, configs: clang-sanitize-undefined } + - { os: ubuntu-20.04, configs: gcc-sanitize-address } + - { os: ubuntu-20.04, configs: gcc-sanitize-undefined } - { os: ubuntu-20.04, configs: gcc-7 } - { os: ubuntu-20.04, configs: gcc-8 } - { os: ubuntu-20.04, configs: gcc-10 } From c483a5c0fb8e8b8915fad85c5f6113386a4341ca Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 6 Jul 2022 11:52:54 +1000 Subject: [PATCH 159/287] Test against openssl-3.0.5. --- .github/workflows/c-cpp.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 9f918b950..468d986a8 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -64,7 +64,7 @@ jobs: - { os: ubuntu-latest, configs: openssl-1.1.1n } - { os: ubuntu-latest, configs: openssl-1.1.1p } - { os: ubuntu-latest, configs: openssl-3.0.0 } - - { os: ubuntu-latest, configs: openssl-3.0.4 } + - { os: ubuntu-latest, configs: openssl-3.0.5 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - { os: ubuntu-18.04, configs: pam } From fb2f3a61bf3d28fff285524535f7ffcd177c9235 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 Jul 2022 12:54:24 +1000 Subject: [PATCH 160/287] Move unset to before we set anything. --- .github/configs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/configs b/.github/configs index 0308ca6c1..48070ee75 100755 --- a/.github/configs +++ b/.github/configs @@ -10,6 +10,8 @@ config=$1 +unset CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO + TEST_TARGET="tests" LTESTS="" SKIP_LTESTS="" @@ -17,7 +19,6 @@ SUDO=sudo # run with sudo by default TEST_SSH_UNSAFE_PERMISSIONS=1 # Stop on first test failure to minimize logs TEST_SSH_FAIL_FATAL=yes -unset CC CFLAGS CPPFLAGS LDFLAGS LTESTS SUDO CONFIGFLAGS="" LIBCRYPTOFLAGS="" @@ -72,7 +73,7 @@ case "$config" in TEST_TARGET="t-exec" ;; clang-sanitize-memory) - CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins" + CFLAGS="-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer" LDFLAGS="-fsanitize=memory" CPPFLAGS='-Dchroot=chdir -Dexplicit_bzero=bzero -DMSAN_OPTIONS=\"log_path='$SANLOGS'/msan.log\"' CONFIGFLAGS="--without-openssl --without-zlib --without-shadow" From d9eaea4bea6271bcee6a2b9428f1271faf2d033b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 Jul 2022 12:54:49 +1000 Subject: [PATCH 161/287] Refuse to use OpenSSL 3.0.4 due to potential RCE. OpenSSL has a potential RCE in its RSA implementation (CVE-2022-2274) so refuse to use that specific version. --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index a0ff6f0b3..6ebdd06a2 100644 --- a/configure.ac +++ b/configure.ac @@ -2796,6 +2796,7 @@ if test "x$openssl" = "xyes" ; then ;; 101*) ;; # 1.1.x 200*) ;; # LibreSSL + 3000004*) AC_MSG_ERROR([OpenSSL 3.0.4 has a potential RCE in its RSA implementation (CVE-2022-2274)]) ;; 300*) # OpenSSL 3; we use the 1.1x API CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" From e75bbc1d88491fa85e61b2cc8783d4bbd00cd131 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 Jul 2022 14:37:15 +1000 Subject: [PATCH 162/287] Capture stderr output from configure. --- .github/configure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/configure.sh b/.github/configure.sh index 502bf5f0d..bd0037702 100755 --- a/.github/configure.sh +++ b/.github/configure.sh @@ -18,4 +18,4 @@ if [ "x$LDFLAGS" != "x" ]; then fi echo ./configure ${CONFIGFLAGS} -./configure ${CONFIGFLAGS} +./configure ${CONFIGFLAGS} 2>&1 From 76f4e48631d7b09fb243b47d7b393d100d3741b7 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 13 Jul 2022 13:17:47 +1000 Subject: [PATCH 163/287] Only refuse to use OpenSSL 3.0.4 on x86_64. The potential RCE only impacts x86_64, so only refuse to use it if we're targetting a potentially impacted architecture. ok djm@ --- configure.ac | 10 +++++++++- regress/keyscan.sh | 13 +++++++++++++ sftp-server-main.c | 2 -- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 6ebdd06a2..0c6a57ebc 100644 --- a/configure.ac +++ b/configure.ac @@ -2796,7 +2796,6 @@ if test "x$openssl" = "xyes" ; then ;; 101*) ;; # 1.1.x 200*) ;; # LibreSSL - 3000004*) AC_MSG_ERROR([OpenSSL 3.0.4 has a potential RCE in its RSA implementation (CVE-2022-2274)]) ;; 300*) # OpenSSL 3; we use the 1.1x API CPPFLAGS="$CPPFLAGS -DOPENSSL_API_COMPAT=0x10100000L" @@ -2820,6 +2819,15 @@ if test "x$openssl" = "xyes" ; then ] ) + case "$host" in + x86_64-*) + case "$ssl_library_ver" in + 3000004*) + AC_MSG_ERROR([OpenSSL 3.0.4 has a potential RCE in its RSA implementation (CVE-2022-2274)]) + ;; + esac + esac + # Sanity check OpenSSL headers AC_MSG_CHECKING([whether OpenSSL's headers match the library]) AC_RUN_IFELSE( diff --git a/regress/keyscan.sh b/regress/keyscan.sh index 75a14ee0e..0b8c33aa4 100644 --- a/regress/keyscan.sh +++ b/regress/keyscan.sh @@ -23,3 +23,16 @@ for t in $SSH_KEYTYPES; do fail "ssh-keyscan -t $t failed with: $r" fi done + +stop_sshd +sleep 1 + +trace "keyscan banner length" +banner="" +for i in `seq 245 256`; do + trace "keyscan length $i" + banner=`perl -le "print 'A'x$i"` + (printf "SSH-2.0-${banner}" | ${NC} -N -l $PORT >/dev/null) & + ${SSHKEYSCAN} -p $PORT 127.0.0.1 + sleep 3 +done diff --git a/sftp-server-main.c b/sftp-server-main.c index 06566d36e..2c70f89bc 100644 --- a/sftp-server-main.c +++ b/sftp-server-main.c @@ -42,8 +42,6 @@ main(int argc, char **argv) /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); - seed_rng(); - if ((user_pw = getpwuid(getuid())) == NULL) { fprintf(stderr, "No user found for uid %lu\n", (u_long)getuid()); From f40b52f21fbc52eb513279168a49d3285c65256c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Tue, 12 Jul 2022 19:48:44 +1000 Subject: [PATCH 164/287] Remove special casing of crypt(). Configure goes to some lengths to pick crypt() from either libcrypt or OpenSSL's libcrypto because they can more or less featureful (eg supporting md5-style passwords). OpenSSL removed its crypt() interface in 2002: https://github.com/openssl/openssl/commit/69deec58 so these hijinks should no longer be necessary. This also only links sshd with libcrypt which is the only thing that needs it. ok djm@ --- configure.ac | 35 +++++++++++------------------------ 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/configure.ac b/configure.ac index 0c6a57ebc..0241fe890 100644 --- a/configure.ac +++ b/configure.ac @@ -674,7 +674,6 @@ case "$host" in AC_DEFINE([DISABLE_WTMP], [1], [Define if you don't want to use wtmp]) ;; *-*-cygwin*) - check_for_libcrypt_later=1 LIBS="$LIBS /usr/lib/textreadmode.o" AC_DEFINE([HAVE_CYGWIN], [1], [Define if you are on Cygwin]) AC_DEFINE([USE_PIPES], [1], [Use PIPES instead of a socketpair()]) @@ -753,7 +752,7 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) [System poll(2) implementation is broken]) ;; *-*-dragonfly*) - SSHDLIBS="$SSHDLIBS -lcrypt" + SSHDLIBS="$SSHDLIBS" TEST_MALLOC_OPTIONS="AFGJPRX" ;; *-*-haiku*) @@ -844,7 +843,6 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) AC_DEFINE([LOCKED_PASSWD_STRING], ["*LK*"]) ;; *-*-k*bsd*-gnu | *-*-kopensolaris*-gnu) - check_for_libcrypt_later=1 AC_DEFINE([PAM_TTY_KLUDGE]) AC_DEFINE([LOCKED_PASSWD_PREFIX], ["!"]) AC_DEFINE([SPT_TYPE], [SPT_REUSEARGV]) @@ -854,7 +852,6 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) *-*-linux*) no_dev_ptmx=1 use_pie=auto - check_for_libcrypt_later=1 check_for_openpty_ctty_bug=1 dnl Target SUSv3/POSIX.1-2001 plus BSD specifics. dnl _DEFAULT_SOURCE is the new name for _BSD_SOURCE @@ -994,7 +991,6 @@ mips-sony-bsd|mips-sony-newsos4) SONY=1 ;; *-*-netbsd*) - check_for_libcrypt_before=1 if test "x$withval" != "xno" ; then rpath_opt="-R" fi @@ -1009,7 +1005,6 @@ mips-sony-bsd|mips-sony-newsos4) [NetBSD read function is sometimes redirected, breaking atomicio comparisons against it]) ;; *-*-freebsd*) - check_for_libcrypt_later=1 AC_DEFINE([LOCKED_PASSWD_PREFIX], ["*LOCKED*"], [Account locked with pw(1)]) AC_DEFINE([SSH_TUN_FREEBSD], [1], [Open tunnel devices the FreeBSD way]) AC_CHECK_HEADER([net/if_tap.h], , @@ -1182,7 +1177,6 @@ mips-sony-bsd|mips-sony-newsos4) AC_DEFINE([PASSWD_NEEDS_USERNAME]) AC_DEFINE([BROKEN_TCGETATTR_ICANON]) TEST_SHELL=$SHELL # let configure find us a capable shell - check_for_libcrypt_later=1 case "$host" in *-*-sysv5SCO_SV*) # SCO OpenServer 6.x maildir=/var/spool/mail @@ -2893,6 +2887,7 @@ if test "x$openssl" = "xyes" ; then AC_CHECK_FUNCS([ \ BN_is_prime_ex \ + DES_crypt \ DSA_generate_parameters_ex \ EVP_CIPHER_CTX_ctrl \ EVP_DigestFinal_ex \ @@ -3060,19 +3055,6 @@ if test "x$openssl" = "xyes" ; then ] ) - # Some systems want crypt() from libcrypt, *not* the version in OpenSSL, - # because the system crypt() is more featureful. - if test "x$check_for_libcrypt_before" = "x1"; then - AC_CHECK_LIB([crypt], [crypt]) - fi - - # Some Linux systems (Slackware) need crypt() from libcrypt, *not* the - # version in OpenSSL. - if test "x$check_for_libcrypt_later" = "x1"; then - AC_CHECK_LIB([crypt], [crypt], [LIBS="$LIBS -lcrypt"]) - fi - AC_CHECK_FUNCS([crypt DES_crypt]) - # Check for SHA256, SHA384 and SHA512 support in OpenSSL AC_CHECK_FUNCS([EVP_sha256 EVP_sha384 EVP_sha512]) @@ -3184,10 +3166,6 @@ if test "x$openssl" = "xyes" ; then ecdsa-sha2-nistp521 \ ecdsa-sha2-nistp521-cert-v01@openssh.com" fi - -else - AC_CHECK_LIB([crypt], [crypt], [LIBS="$LIBS -lcrypt"]) - AC_CHECK_FUNCS([crypt]) fi # PKCS11/U2F depend on OpenSSL and dlopen(). @@ -3303,6 +3281,15 @@ AC_CHECK_LIB([iaf], [ia_openinfo], [ ]) LIBS="$saved_LIBS" +# Check for crypt() in libcrypt. If we have it, we only need it for sshd. +saved_LIBS="$LIBS" +AC_CHECK_LIB([crypt], [crypt], [ + LIBS="-lcrypt $LIBS" + SSHDLIBS="-lcrypt $SSHDLIBS" +]) +AC_CHECK_FUNCS([crypt]) +LIBS="$saved_LIBS" + ### Configure cryptographic random number support # Check whether OpenSSL seeds itself From 00a496c6c14f2d41f2a9365714d494dd5f3aac9f Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 14 Jul 2022 09:56:01 +1000 Subject: [PATCH 165/287] Clarify README.md text. Clarify the text about the implications of building without OpenSSL, and prefix the "configure --help" example command with a "./" so it's likely to work as-is in more shells. From bz#3461. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index de4717737..08e14c595 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Stable release tarballs are available from a number of [download mirrors](https: Portable OpenSSH is built using autoconf and make. It requires a working C compiler, standard library and headers. -``libcrypto`` from either [LibreSSL](https://www.libressl.org/) or [OpenSSL](https://www.openssl.org) may also be used, but OpenSSH may be built without it supporting a subset of crypto algorithms. +``libcrypto`` from either [LibreSSL](https://www.libressl.org/) or [OpenSSL](https://www.openssl.org) may also be used. OpenSSH may be built without either of these, but the resulting binaries will have only a subset of the cryptographic algorithms normally available. [zlib](https://www.zlib.net/) is optional; without it transport compression is not supported. @@ -65,7 +65,7 @@ make && make tests There are many build-time customisation options available. All Autoconf destination path flags (e.g. ``--prefix``) are supported (and are usually required if you want to install OpenSSH). -For a full list of available flags, run ``configure --help`` but a few of the more frequently-used ones are described below. Some of these flags will require additional libraries and/or headers be installed. +For a full list of available flags, run ``./configure --help`` but a few of the more frequently-used ones are described below. Some of these flags will require additional libraries and/or headers be installed. Flag | Meaning --- | --- From 36857fefd8849c4b0e877cfd9d1eb22f79b76650 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 14 Jul 2022 10:02:35 +1000 Subject: [PATCH 166/287] Split README.platform into its own line. README.platform has general platform-specific information, having it following text about FIDO2 on the same line could imply that it only has information about FIDO2. --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08e14c595..04e3a5198 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ Portable OpenSSH is built using autoconf and make. It requires a working C compi [zlib](https://www.zlib.net/) is optional; without it transport compression is not supported. -FIDO security token support needs [libfido2](https://github.com/Yubico/libfido2) and its dependencies. Also, certain platforms and build-time options may require additional dependencies; see README.platform for details. +FIDO security token support needs [libfido2](https://github.com/Yubico/libfido2) and its dependencies. + +In addition, certain platforms and build-time options may require additional dependencies; see README.platform for details about your platform. ### Building a release From 527cb43fa1b4e55df661feabbac51b8e608b6519 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 14 Jul 2022 11:22:08 +1000 Subject: [PATCH 167/287] Return ERANGE from getcwd() if buffer size is 1. If getcwd() is supplied a buffer size of exactly 1 and a path of "/", it could result in a nul byte being written out of array bounds. POSIX says it should return ERANGE if the path will not fit in the available buffer (with terminating nul). 1 byte cannot fit any possible path with its nul, so immediately return ERANGE in that case. OpenSSH never uses getcwd() with this buffer size, and all current (and even quite old) platforms that we are currently known to work on have a native getcwd() so this code is not used on those anyway. Reported by Qualys, ok djm@ --- openbsd-compat/getcwd.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openbsd-compat/getcwd.c b/openbsd-compat/getcwd.c index 2d56bae19..a904291a2 100644 --- a/openbsd-compat/getcwd.c +++ b/openbsd-compat/getcwd.c @@ -70,9 +70,12 @@ getcwd(char *pt, size_t size) */ if (pt) { ptsize = 0; - if (!size) { + if (size == 0) { errno = EINVAL; return (NULL); + } else if (size == 1) { + errno = ERANGE; + return (NULL); } ept = pt + size; } else { From a061792a6e8d235fc40a9b5d4c22a1762bb75a7b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 14 Jul 2022 19:20:24 +1000 Subject: [PATCH 168/287] Remove unintended changes. I inadvertently included a couple of local changes with the OpenSSL 3.0.4 change. Revert, anything that should be there will be committed separately. --- regress/keyscan.sh | 13 ------------- sftp-server-main.c | 2 ++ 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/regress/keyscan.sh b/regress/keyscan.sh index 0b8c33aa4..75a14ee0e 100644 --- a/regress/keyscan.sh +++ b/regress/keyscan.sh @@ -23,16 +23,3 @@ for t in $SSH_KEYTYPES; do fail "ssh-keyscan -t $t failed with: $r" fi done - -stop_sshd -sleep 1 - -trace "keyscan banner length" -banner="" -for i in `seq 245 256`; do - trace "keyscan length $i" - banner=`perl -le "print 'A'x$i"` - (printf "SSH-2.0-${banner}" | ${NC} -N -l $PORT >/dev/null) & - ${SSHKEYSCAN} -p $PORT 127.0.0.1 - sleep 3 -done diff --git a/sftp-server-main.c b/sftp-server-main.c index 2c70f89bc..06566d36e 100644 --- a/sftp-server-main.c +++ b/sftp-server-main.c @@ -42,6 +42,8 @@ main(int argc, char **argv) /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); + seed_rng(); + if ((user_pw = getpwuid(getuid())) == NULL) { fprintf(stderr, "No user found for uid %lu\n", (u_long)getuid()); From 751d22cdeffed9fe921db78eedc32a29f9e80510 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 15 Jul 2022 13:37:29 +1000 Subject: [PATCH 169/287] Add AUDIT_ARCH_PPC to supported seccomp arches. Patch from dries.deschout at dodeco.eu. --- configure.ac | 3 +++ 1 file changed, 3 insertions(+) diff --git a/configure.ac b/configure.ac index 0241fe890..3e9fd7005 100644 --- a/configure.ac +++ b/configure.ac @@ -936,6 +936,9 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) s390-*) seccomp_audit_arch=AUDIT_ARCH_S390 ;; + powerpc-*) + seccomp_audit_arch=AUDIT_ARCH_PPC + ;; powerpc64-*) seccomp_audit_arch=AUDIT_ARCH_PPC64 ;; From 46b91b70ff3cb9c147e2875ef5dc609fd64c0c96 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 15 Jul 2022 20:25:27 +1000 Subject: [PATCH 170/287] Rename bbone test target to ARM. --- .github/workflows/selfhosted.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 2ddf27599..fcbb6d94f 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -18,9 +18,9 @@ jobs: matrix: os: - aix51 + - ARM - ARM64 - alpine - - bbone - debian-i386 - debian-riscv64 - dfly30 From eb679e2959bdb15454eb94751930eb4c9110da94 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 15 Jul 2022 21:31:48 +1000 Subject: [PATCH 171/287] Move vmshutdown to first step. If a previous run on a physical runner has failed to clean up, the next run will fail because it'll try to check out the code to a broken directory mount. Make cleanup the first step. --- .github/workflows/selfhosted.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index fcbb6d94f..7ce318b17 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -72,11 +72,11 @@ jobs: # - { os: sol11, configs: sol64-pam } - { os: win10, configs: cygwin-release } steps: + - name: shutdown VM if running + run: vmshutdown - uses: actions/checkout@v2 - name: autoreconf run: autoreconf - - name: shutdown VM if running - run: vmshutdown - name: startup VM run: vmstartup - name: configure From 5bcfc788b38d5b64e4c347bdc04bd9a01bbc36da Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 20 Jul 2022 03:13:04 +0000 Subject: [PATCH 172/287] upstream: pull passphrase reading and confirmation into a separate function so it can be used for FIDO2 PINs; no functional change OpenBSD-Commit-ID: bf34f76b8283cc1d3f54633e0d4f13613d87bb2f --- ssh-keygen.c | 65 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index f122cbd1b..0664e3b14 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.454 2022/06/03 03:17:42 dtucker Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.455 2022/07/20 03:13:04 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -591,10 +591,13 @@ do_convert_private_ssh2(struct sshbuf *b) error_f("remaining bytes in key blob %d", rlen); /* try the key */ - if (sshkey_sign(key, &sig, &slen, data, sizeof(data), - NULL, NULL, NULL, 0) != 0 || - sshkey_verify(key, sig, slen, data, sizeof(data), - NULL, 0, NULL) != 0) { + if ((r = sshkey_sign(key, &sig, &slen, data, sizeof(data), + NULL, NULL, NULL, 0)) != 0) + error_fr(r, "signing with converted key failed"); + else if ((r = sshkey_verify(key, sig, slen, data, sizeof(data), + NULL, 0, NULL)) != 0) + error_fr(r, "verification with converted key failed"); + if (r != 0) { sshkey_free(key); free(sig); return NULL; @@ -3026,37 +3029,43 @@ do_moduli_screen(const char *out_file, char **opts, size_t nopts) #endif /* WITH_OPENSSL */ } +/* Read and confirm a passphrase */ static char * -private_key_passphrase(void) +read_check_passphrase(const char *prompt1, const char *prompt2, + const char *retry_prompt) { char *passphrase1, *passphrase2; - /* Ask for a passphrase (twice). */ - if (identity_passphrase) - passphrase1 = xstrdup(identity_passphrase); - else if (identity_new_passphrase) - passphrase1 = xstrdup(identity_new_passphrase); - else { -passphrase_again: - passphrase1 = - read_passphrase("Enter passphrase (empty for no " - "passphrase): ", RP_ALLOW_STDIN); - passphrase2 = read_passphrase("Enter same passphrase again: ", - RP_ALLOW_STDIN); - if (strcmp(passphrase1, passphrase2) != 0) { - /* - * The passphrases do not match. Clear them and - * retry. - */ - freezero(passphrase1, strlen(passphrase1)); + for (;;) { + passphrase1 = read_passphrase(prompt1, RP_ALLOW_STDIN); + passphrase2 = read_passphrase(prompt2, RP_ALLOW_STDIN); + if (strcmp(passphrase1, passphrase2) == 0) { freezero(passphrase2, strlen(passphrase2)); - printf("Passphrases do not match. Try again.\n"); - goto passphrase_again; + return passphrase1; } - /* Clear the other copy of the passphrase. */ + /* The passphrases do not match. Clear them and retry. */ + freezero(passphrase1, strlen(passphrase1)); freezero(passphrase2, strlen(passphrase2)); + fputs(retry_prompt, stdout); + fputc('\n', stdout); + fflush(stdout); } - return passphrase1; + /* NOTREACHED */ + return NULL; +} + +static char * +private_key_passphrase(void) +{ + if (identity_passphrase) + return xstrdup(identity_passphrase); + if (identity_new_passphrase) + return xstrdup(identity_new_passphrase); + + return read_check_passphrase( + "Enter passphrase (empty for no passphrase): ", + "Enter same passphrase again: ", + "Passphrases do not match. Try again."); } static char * From 9ab929ca2d820520327b41929372bcb9e261534c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 20 Jul 2022 03:29:14 +0000 Subject: [PATCH 173/287] upstream: when enrolling a resident key on a security token, check if a credential with matching application and user ID strings already exists. if so, prompt the user for confirmation before overwriting the credential. patch from Pedro Martelletto via GHPR329 NB. cranks SSH_SK_VERSION_MAJOR, so any third-party FIDO middleware implementations will need to adjust OpenBSD-Commit-ID: e45e9f1bf2b2f32d9850669e7a8dbd64acc5fca4 --- sk-api.h | 6 +++-- sk-usbhid.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++-- ssh-keygen.c | 27 +++++++++++++++++++- ssh-sk.c | 4 ++- 4 files changed, 102 insertions(+), 6 deletions(-) diff --git a/sk-api.h b/sk-api.h index 34e110b4e..08f567a9e 100644 --- a/sk-api.h +++ b/sk-api.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-api.h,v 1.14 2021/11/02 22:56:40 djm Exp $ */ +/* $OpenBSD: sk-api.h,v 1.15 2022/07/20 03:29:14 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -26,6 +26,7 @@ /* Flags */ #define SSH_SK_USER_PRESENCE_REQD 0x01 #define SSH_SK_USER_VERIFICATION_REQD 0x04 +#define SSH_SK_FORCE_OPERATION 0x10 #define SSH_SK_RESIDENT_KEY 0x20 /* Algs */ @@ -37,6 +38,7 @@ #define SSH_SK_ERR_UNSUPPORTED -2 #define SSH_SK_ERR_PIN_REQUIRED -3 #define SSH_SK_ERR_DEVICE_NOT_FOUND -4 +#define SSH_SK_ERR_CREDENTIAL_EXISTS -5 struct sk_enroll_response { uint8_t flags; @@ -77,7 +79,7 @@ struct sk_option { uint8_t required; }; -#define SSH_SK_VERSION_MAJOR 0x00090000 /* current API version */ +#define SSH_SK_VERSION_MAJOR 0x000a0000 /* current API version */ #define SSH_SK_VERSION_MAJOR_MASK 0xffff0000 /* Return the version of the middleware API */ diff --git a/sk-usbhid.c b/sk-usbhid.c index 2d58c7836..d168cd031 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.39 2022/04/29 03:16:48 dtucker Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.40 2022/07/20 03:29:14 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -398,7 +398,7 @@ sk_try(const struct sk_usbhid *sk, const char *application, /* generate an invalid signature on FIDO2 tokens */ if ((r = fido_assert_set_clientdata(assert, message, sizeof(message))) != FIDO_OK) { - skdebug(__func__, "fido_assert_set_clientdata_hash: %s", + skdebug(__func__, "fido_assert_set_clientdata: %s", fido_strerr(r)); goto out; } @@ -764,6 +764,60 @@ check_enroll_options(struct sk_option **options, char **devicep, return 0; } +static int +key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, + size_t user_id_len, const char *pin) +{ + fido_assert_t *assert = NULL; + uint8_t message[32]; + int r = FIDO_ERR_INTERNAL; + size_t i; + + memset(message, '\0', sizeof(message)); + if (pin == NULL) { + skdebug(__func__, "NULL pin"); + goto out; + } + if ((assert = fido_assert_new()) == NULL) { + skdebug(__func__, "fido_assert_new failed"); + goto out; + } + /* generate an invalid signature on FIDO2 tokens */ + if ((r = fido_assert_set_clientdata(assert, message, + sizeof(message))) != FIDO_OK) { + skdebug(__func__, "fido_assert_set_clientdata: %s", + fido_strerr(r)); + goto out; + } + if ((r = fido_assert_set_rp(assert, application)) != FIDO_OK) { + skdebug(__func__, "fido_assert_set_rp: %s", fido_strerr(r)); + goto out; + } + if ((r = fido_assert_set_up(assert, FIDO_OPT_FALSE)) != FIDO_OK) { + skdebug(__func__, "fido_assert_up: %s", fido_strerr(r)); + goto out; + } + if ((r = fido_dev_get_assert(dev, assert, pin)) != FIDO_OK) { + skdebug(__func__, "fido_dev_get_assert: %s", fido_strerr(r)); + goto out; + } + r = FIDO_ERR_NO_CREDENTIALS; + skdebug(__func__, "%zu signatures returned", fido_assert_count(assert)); + for (i = 0; i < fido_assert_count(assert); i++) { + if (fido_assert_user_id_len(assert, i) == user_id_len && + memcmp(fido_assert_user_id_ptr(assert, i), user_id, + user_id_len) == 0) { + skdebug(__func__, "credential exists"); + r = FIDO_OK; + goto out; + } + } + out: + fido_assert_free(&assert); + + return r; +} + int sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, const char *application, uint8_t flags, const char *pin, @@ -817,6 +871,19 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, goto out; } skdebug(__func__, "using device %s", sk->path); + if ((flags & SSH_SK_RESIDENT_KEY) != 0 && + (flags & SSH_SK_FORCE_OPERATION) == 0 && + (r = key_lookup(sk->dev, application, user_id, sizeof(user_id), + pin)) != FIDO_ERR_NO_CREDENTIALS) { + if (r != FIDO_OK) { + ret = SSH_SK_ERR_GENERAL; + skdebug(__func__, "key_lookup failed"); + } else { + ret = SSH_SK_ERR_CREDENTIAL_EXISTS; + skdebug(__func__, "key exists"); + } + goto out; + } if ((cred = fido_cred_new()) == NULL) { skdebug(__func__, "fido_cred_new failed"); goto out; diff --git a/ssh-keygen.c b/ssh-keygen.c index 0664e3b14..51cb7e323 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.455 2022/07/20 03:13:04 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.456 2022/07/20 03:29:14 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3216,6 +3216,24 @@ save_attestation(struct sshbuf *attest, const char *path) "%s\n", path); } +static int +confirm_sk_overwrite(const char *application, const char *user) +{ + char yesno[3]; + + printf("A resident key scoped to '%s' with user id '%s' already " + "exists.\n", application == NULL ? "ssh:" : application, + user == NULL ? "null" : user); + printf("Overwrite key in token (y/n)? "); + fflush(stdout); + if (fgets(yesno, sizeof(yesno), stdin) == NULL) + return 0; + if (yesno[0] != 'y' && yesno[0] != 'Y') + return 0; + printf("Touch your authenticator to authorize key generation.\n"); + return 1; +} + static void usage(void) { @@ -3803,6 +3821,13 @@ main(int argc, char **argv) &private, attest); if (r == 0) break; + if (r == SSH_ERR_KEY_BAD_PERMISSIONS && + (sk_flags & SSH_SK_RESIDENT_KEY) != 0 && + (sk_flags & SSH_SK_FORCE_OPERATION) == 0 && + confirm_sk_overwrite(sk_application, sk_user)) { + sk_flags |= SSH_SK_FORCE_OPERATION; + continue; + } if (r != SSH_ERR_KEY_WRONG_PASSPHRASE) fatal_r(r, "Key enrollment failed"); else if (passphrase != NULL) { diff --git a/ssh-sk.c b/ssh-sk.c index ba5146079..fbeb39320 100644 --- a/ssh-sk.c +++ b/ssh-sk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-sk.c,v 1.38 2022/01/14 03:35:10 djm Exp $ */ +/* $OpenBSD: ssh-sk.c,v 1.39 2022/07/20 03:29:14 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -354,6 +354,8 @@ skerr_to_ssherr(int skerr) return SSH_ERR_KEY_WRONG_PASSPHRASE; case SSH_SK_ERR_DEVICE_NOT_FOUND: return SSH_ERR_DEVICE_NOT_FOUND; + case SSH_SK_ERR_CREDENTIAL_EXISTS: + return SSH_ERR_KEY_BAD_PERMISSIONS; case SSH_SK_ERR_GENERAL: default: return SSH_ERR_INVALID_FORMAT; From 8638a2ce7e90c8a51d9af3143404282126c524f8 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 20 Jul 2022 03:31:42 +0000 Subject: [PATCH 174/287] upstream: sk-usbhid: preserve error code returned by key_lookup() it conveys useful information, such as the supplied pin being wrong. Part of GHPR329 from Pedro Martelletto OpenBSD-Commit-ID: c0647eb9290f793add363d81378439b273756c1b --- sk-usbhid.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index d168cd031..616fc5565 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.40 2022/07/20 03:29:14 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.41 2022/07/20 03:31:42 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -876,7 +876,7 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, (r = key_lookup(sk->dev, application, user_id, sizeof(user_id), pin)) != FIDO_ERR_NO_CREDENTIALS) { if (r != FIDO_OK) { - ret = SSH_SK_ERR_GENERAL; + ret = fidoerr_to_skerr(r); skdebug(__func__, "key_lookup failed"); } else { ret = SSH_SK_ERR_CREDENTIAL_EXISTS; From f208e3b9ffb5ee76cf9c95df7ff967adc7f51c7d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 20 Jul 2022 03:33:22 +0000 Subject: [PATCH 175/287] upstream: ssh-keygen: fix touch prompt, pin retries; part of GHPR329 from Pedro Martelletto OpenBSD-Commit-ID: 75d1005bd2ef8f29fa834c90d2684e73556fffe8 --- ssh-keygen.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index 51cb7e323..77f790134 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.456 2022/07/20 03:29:14 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.457 2022/07/20 03:33:22 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3230,7 +3230,6 @@ confirm_sk_overwrite(const char *application, const char *user) return 0; if (yesno[0] != 'y' && yesno[0] != 'Y') return 0; - printf("Touch your authenticator to authorize key generation.\n"); return 1; } @@ -3800,10 +3799,6 @@ main(int argc, char **argv) "FIDO authenticator enrollment", opts[i]); } } - if (!quiet) { - printf("You may need to touch your authenticator " - "to authorize key generation.\n"); - } if ((attest = sshbuf_new()) == NULL) fatal("sshbuf_new failed"); if ((sk_flags & @@ -3813,7 +3808,14 @@ main(int argc, char **argv) } else { passphrase = NULL; } - for (i = 0 ; ; i++) { + r = 0; + for (i = 0 ;;) { + if (!quiet) { + printf("You may need to touch your " + "authenticator%s to authorize key " + "generation.\n", + r == 0 ? "" : " again"); + } fflush(stdout); r = sshsk_enroll(type, sk_provider, sk_device, sk_application == NULL ? "ssh:" : sk_application, @@ -3835,15 +3837,10 @@ main(int argc, char **argv) freezero(passphrase, strlen(passphrase)); passphrase = NULL; } - if (i >= 3) + if (++i >= 3) fatal("Too many incorrect PINs"); passphrase = read_passphrase("Enter PIN for " "authenticator: ", RP_ALLOW_STDIN); - if (!quiet) { - printf("You may need to touch your " - "authenticator (again) to authorize " - "key generation.\n"); - } } if (passphrase != NULL) { freezero(passphrase, strlen(passphrase)); From c46f6fed419167c1671e4227459e108036c760f8 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 20 Jul 2022 13:39:14 +1000 Subject: [PATCH 176/287] crank SSH_SK_VERSION_MAJOR in sk-dummy.so --- regress/misc/sk-dummy/sk-dummy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/misc/sk-dummy/sk-dummy.c b/regress/misc/sk-dummy/sk-dummy.c index a10c0be28..ad5e47452 100644 --- a/regress/misc/sk-dummy/sk-dummy.c +++ b/regress/misc/sk-dummy/sk-dummy.c @@ -59,7 +59,7 @@ /* #define SK_DEBUG 1 */ -#if SSH_SK_VERSION_MAJOR != 0x00090000 +#if SSH_SK_VERSION_MAJOR != 0x000a0000 # error SK API has changed, sk-dummy.c needs an update #endif From ea7ecc2c3ae39fdf5c6ad97b7bc0b47a98847f43 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 23 Jul 2022 14:36:38 +1000 Subject: [PATCH 177/287] Skip scp3 test if there's no scp on remote path. scp -3 ends up using the scp that's in the remote path and will fail if one is not available. Based on a patch from rapier at psc.edu. --- regress/scp3.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/regress/scp3.sh b/regress/scp3.sh index f71b15677..47db47cd6 100644 --- a/regress/scp3.sh +++ b/regress/scp3.sh @@ -9,6 +9,12 @@ COPY2=${OBJ}/copy2 DIR=${COPY}.dd DIR2=${COPY}.dd2 +$SSH -F $OBJ/ssh_proxy somehost \ + 'IFS=":"; for i in $PATH;do [ -x "$i/scp" ] && exit 0; done; exit 1' +if [ $? -eq 1 ]; then + skip "No scp on remote path." +fi + SRC=`dirname ${SCRIPT}` cp ${SRC}/scp-ssh-wrapper.sh ${OBJ}/scp-ssh-wrapper.scp chmod 755 ${OBJ}/scp-ssh-wrapper.scp From f69319ad8ad1dd50f90bbcf5912e11cc8ed3e037 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 23 Jul 2022 14:38:22 +1000 Subject: [PATCH 178/287] Convert "have_prog" function into "which". "which" and its behaviour is not standardized, so convert the existing have_prog function into "which" so we can rely on it being available and what its semantics are. Add a have_prog wrapper that maintains the existing behaviour. --- regress/test-exec.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/regress/test-exec.sh b/regress/test-exec.sh index 45b11734e..d25c330b8 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -320,7 +320,7 @@ export SSH_PKCS11_HELPER SSH_SK_HELPER #echo $SSH $SSHD $SSHAGENT $SSHADD $SSHKEYGEN $SSHKEYSCAN $SFTP $SFTPSERVER $SCP # Portable specific functions -have_prog() +which() { saved_IFS="$IFS" IFS=":" @@ -328,13 +328,21 @@ have_prog() do if [ -x $i/$1 ]; then IFS="$saved_IFS" + echo "$i/$1" return 0 fi done IFS="$saved_IFS" + echo "$i/$1" return 1 } +have_prog() +{ + which "$1" >/dev/null 2>&1 + return $? +} + jot() { awk "BEGIN { for (i = $2; i < $2 + $1; i++) { printf \"%d\n\", i } exit }" } From 0ff886be132299386cc29d87c2aa16ff68a1aa08 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Sun, 24 Jul 2022 23:29:10 +0000 Subject: [PATCH 179/287] upstream: Test TEST_SSH_ELAPSED_TIMES for empty string not executable. No-op on most platforms but should prevent warnings in -portable on systems that don't have 'date %s'. OpenBSD-Regress-ID: e39d79867b8065e33d0c5926fa1a31f85659d2a4 --- regress/test-exec.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regress/test-exec.sh b/regress/test-exec.sh index d25c330b8..5d71d5836 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -1,9 +1,9 @@ -# $OpenBSD: test-exec.sh,v 1.90 2022/07/04 09:10:31 dtucker Exp $ +# $OpenBSD: test-exec.sh,v 1.91 2022/07/24 23:29:10 dtucker Exp $ # Placed in the Public Domain. #SUDO=sudo -if [ ! -x "$TEST_SSH_ELAPSED_TIMES" ]; then +if [ -z "$TEST_SSH_ELAPSED_TIMES" ]; then STARTTIME=`date '+%s'` fi From 5a4a9f7a968fbf92cc1eac519c65638e79ae9f1f Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Mon, 25 Jul 2022 07:12:45 +0000 Subject: [PATCH 180/287] upstream: Restore missing "!" in TEST_SSH_ELAPSED_TIMES test. OpenBSD-Regress-ID: 38783f9676ec348c5a792caecee9a16e354b37b0 --- regress/test-exec.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regress/test-exec.sh b/regress/test-exec.sh index 5d71d5836..c51f8eac1 100644 --- a/regress/test-exec.sh +++ b/regress/test-exec.sh @@ -1,9 +1,9 @@ -# $OpenBSD: test-exec.sh,v 1.91 2022/07/24 23:29:10 dtucker Exp $ +# $OpenBSD: test-exec.sh,v 1.92 2022/07/25 07:12:45 dtucker Exp $ # Placed in the Public Domain. #SUDO=sudo -if [ -z "$TEST_SSH_ELAPSED_TIMES" ]; then +if [ ! -z "$TEST_SSH_ELAPSED_TIMES" ]; then STARTTIME=`date '+%s'` fi From b7c56b65c12f51fe0dbae798d19c8f58224a5d95 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 25 Jul 2022 21:43:00 +1000 Subject: [PATCH 181/287] Remove workarounds for OpenSSL missing AES-GCM. We have some compatibility hacks that were added to support OpenSSL versions that do not support AES GCM mode. Since that time, however, the minimum OpenSSL version that we support has moved to 1.0.1 which *does* have GCM, so this is no longer needed. ok djm@ --- cipher.c | 2 -- configure.ac | 30 ------------------------------ openbsd-compat/openssl-compat.h | 17 ----------------- 3 files changed, 49 deletions(-) diff --git a/cipher.c b/cipher.c index 5b3a86d69..623f6afcd 100644 --- a/cipher.c +++ b/cipher.c @@ -94,12 +94,10 @@ static const struct sshcipher ciphers[] = { { "aes128-ctr", 16, 16, 0, 0, 0, EVP_aes_128_ctr }, { "aes192-ctr", 16, 24, 0, 0, 0, EVP_aes_192_ctr }, { "aes256-ctr", 16, 32, 0, 0, 0, EVP_aes_256_ctr }, -# ifdef OPENSSL_HAVE_EVPGCM { "aes128-gcm@openssh.com", 16, 16, 12, 16, 0, EVP_aes_128_gcm }, { "aes256-gcm@openssh.com", 16, 32, 12, 16, 0, EVP_aes_256_gcm }, -# endif /* OPENSSL_HAVE_EVPGCM */ #else { "aes128-ctr", 16, 16, 0, 0, CFLAG_AESCTR, NULL }, { "aes192-ctr", 16, 24, 0, 0, CFLAG_AESCTR, NULL }, diff --git a/configure.ac b/configure.ac index 3e9fd7005..f618300ff 100644 --- a/configure.ac +++ b/configure.ac @@ -2892,7 +2892,6 @@ if test "x$openssl" = "xyes" ; then BN_is_prime_ex \ DES_crypt \ DSA_generate_parameters_ex \ - EVP_CIPHER_CTX_ctrl \ EVP_DigestFinal_ex \ EVP_DigestInit_ex \ EVP_MD_CTX_cleanup \ @@ -3009,35 +3008,6 @@ if test "x$openssl" = "xyes" ; then ] ) - # Check for OpenSSL with EVP_aes_*gcm - AC_MSG_CHECKING([whether OpenSSL has AES GCM via EVP]) - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([[ - #include - #include - #include - ]], [[ - exit(EVP_aes_128_gcm() == NULL || - EVP_aes_256_gcm() == NULL || - EVP_CTRL_GCM_SET_IV_FIXED == 0 || - EVP_CTRL_GCM_IV_GEN == 0 || - EVP_CTRL_GCM_SET_TAG == 0 || - EVP_CTRL_GCM_GET_TAG == 0 || - EVP_CIPHER_CTX_ctrl(NULL, 0, 0, NULL) == 0); - ]])], - [ - AC_MSG_RESULT([yes]) - AC_DEFINE([OPENSSL_HAVE_EVPGCM], [1], - [libcrypto has EVP AES GCM]) - ], - [ - AC_MSG_RESULT([no]) - unsupported_algorithms="$unsupported_cipers \ - aes128-gcm@openssh.com \ - aes256-gcm@openssh.com" - ] - ) - AC_MSG_CHECKING([if EVP_DigestUpdate returns an int]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h index 8ca50b5ac..a60df1257 100644 --- a/openbsd-compat/openssl-compat.h +++ b/openbsd-compat/openssl-compat.h @@ -76,23 +76,6 @@ const EVP_CIPHER *evp_aes_128_ctr(void); void ssh_aes_ctr_iv(EVP_CIPHER_CTX *, int, u_char *, size_t); #endif -/* Avoid some #ifdef. Code that uses these is unreachable without GCM */ -#if !defined(OPENSSL_HAVE_EVPGCM) && !defined(EVP_CTRL_GCM_SET_IV_FIXED) -# define EVP_CTRL_GCM_SET_IV_FIXED -1 -# define EVP_CTRL_GCM_IV_GEN -1 -# define EVP_CTRL_GCM_SET_TAG -1 -# define EVP_CTRL_GCM_GET_TAG -1 -#endif - -/* Replace missing EVP_CIPHER_CTX_ctrl() with something that returns failure */ -#ifndef HAVE_EVP_CIPHER_CTX_CTRL -# ifdef OPENSSL_HAVE_EVPGCM -# error AES-GCM enabled without EVP_CIPHER_CTX_ctrl /* shouldn't happen */ -# else -# define EVP_CIPHER_CTX_ctrl(a,b,c,d) (0) -# endif -#endif - /* LibreSSL/OpenSSL 1.1x API compat */ #ifndef HAVE_DSA_GET0_PQG void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, From 800c2483e68db38bd1566ff69677124be974aceb Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 25 Jul 2022 21:49:04 +1000 Subject: [PATCH 182/287] Remove workarounds for OpenSSL missing AES-CTR. We have some compatibility hacks that were added to support OpenSSL versions that do not support AES CTR mode. Since that time, however, the minimum OpenSSL version that we support has moved to 1.0.1 which *does* have CTR, so this is no longer needed. ok djm@ --- .depend | 1 - Makefile.in | 2 +- cipher-ctr.c | 146 -------------------------------- cipher.c | 11 --- configure.ac | 22 ----- openbsd-compat/openssl-compat.h | 8 -- 6 files changed, 1 insertion(+), 189 deletions(-) delete mode 100644 cipher-ctr.c diff --git a/.depend b/.depend index cd38d15f8..0661aba3d 100644 --- a/.depend +++ b/.depend @@ -39,7 +39,6 @@ cipher-aes.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-co cipher-aesctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher-aesctr.h rijndael.h cipher-chachapoly-libcrypto.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher-chachapoly.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sshbuf.h cipher-chachapoly.h chacha.h poly1305.h -cipher-ctr.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h misc.h sshbuf.h ssherr.h digest.h openbsd-compat/openssl-compat.h cleanup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h clientloop.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h ssh2.h packet.h dispatch.h sshbuf.h compat.h channels.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h diff --git a/Makefile.in b/Makefile.in index 3c2856829..a5c292bda 100644 --- a/Makefile.in +++ b/Makefile.in @@ -94,7 +94,7 @@ LIBOPENSSH_OBJS=\ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ authfd.o authfile.o \ canohost.o channels.o cipher.o cipher-aes.o cipher-aesctr.o \ - cipher-ctr.o cleanup.o \ + cleanup.o \ compat.o fatal.o hostfile.o \ log.o match.o moduli.o nchan.o packet.o \ readpass.o ttymodes.o xmalloc.o addr.o addrmatch.o \ diff --git a/cipher-ctr.c b/cipher-ctr.c deleted file mode 100644 index 32771f287..000000000 --- a/cipher-ctr.c +++ /dev/null @@ -1,146 +0,0 @@ -/* $OpenBSD: cipher-ctr.c,v 1.11 2010/10/01 23:05:32 djm Exp $ */ -/* - * Copyright (c) 2003 Markus Friedl - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ -#include "includes.h" - -#if defined(WITH_OPENSSL) && !defined(OPENSSL_HAVE_EVPCTR) -#include - -#include -#include - -#include - -#include "xmalloc.h" -#include "log.h" - -/* compatibility with old or broken OpenSSL versions */ -#include "openbsd-compat/openssl-compat.h" - -#ifndef USE_BUILTIN_RIJNDAEL -#include -#endif - -struct ssh_aes_ctr_ctx -{ - AES_KEY aes_ctx; - u_char aes_counter[AES_BLOCK_SIZE]; -}; - -/* - * increment counter 'ctr', - * the counter is of size 'len' bytes and stored in network-byte-order. - * (LSB at ctr[len-1], MSB at ctr[0]) - */ -static void -ssh_ctr_inc(u_char *ctr, size_t len) -{ - int i; - - for (i = len - 1; i >= 0; i--) - if (++ctr[i]) /* continue on overflow */ - return; -} - -static int -ssh_aes_ctr(EVP_CIPHER_CTX *ctx, u_char *dest, const u_char *src, - LIBCRYPTO_EVP_INL_TYPE len) -{ - struct ssh_aes_ctr_ctx *c; - size_t n = 0; - u_char buf[AES_BLOCK_SIZE]; - - if (len == 0) - return (1); - if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) - return (0); - - while ((len--) > 0) { - if (n == 0) { - AES_encrypt(c->aes_counter, buf, &c->aes_ctx); - ssh_ctr_inc(c->aes_counter, AES_BLOCK_SIZE); - } - *(dest++) = *(src++) ^ buf[n]; - n = (n + 1) % AES_BLOCK_SIZE; - } - return (1); -} - -static int -ssh_aes_ctr_init(EVP_CIPHER_CTX *ctx, const u_char *key, const u_char *iv, - int enc) -{ - struct ssh_aes_ctr_ctx *c; - - if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) == NULL) { - c = xmalloc(sizeof(*c)); - EVP_CIPHER_CTX_set_app_data(ctx, c); - } - if (key != NULL) - AES_set_encrypt_key(key, EVP_CIPHER_CTX_key_length(ctx) * 8, - &c->aes_ctx); - if (iv != NULL) - memcpy(c->aes_counter, iv, AES_BLOCK_SIZE); - return (1); -} - -static int -ssh_aes_ctr_cleanup(EVP_CIPHER_CTX *ctx) -{ - struct ssh_aes_ctr_ctx *c; - - if ((c = EVP_CIPHER_CTX_get_app_data(ctx)) != NULL) { - memset(c, 0, sizeof(*c)); - free(c); - EVP_CIPHER_CTX_set_app_data(ctx, NULL); - } - return (1); -} - -void -ssh_aes_ctr_iv(EVP_CIPHER_CTX *evp, int doset, u_char * iv, size_t len) -{ - struct ssh_aes_ctr_ctx *c; - - if ((c = EVP_CIPHER_CTX_get_app_data(evp)) == NULL) - fatal("ssh_aes_ctr_iv: no context"); - if (doset) - memcpy(c->aes_counter, iv, len); - else - memcpy(iv, c->aes_counter, len); -} - -const EVP_CIPHER * -evp_aes_128_ctr(void) -{ - static EVP_CIPHER aes_ctr; - - memset(&aes_ctr, 0, sizeof(EVP_CIPHER)); - aes_ctr.nid = NID_undef; - aes_ctr.block_size = AES_BLOCK_SIZE; - aes_ctr.iv_len = AES_BLOCK_SIZE; - aes_ctr.key_len = 16; - aes_ctr.init = ssh_aes_ctr_init; - aes_ctr.cleanup = ssh_aes_ctr_cleanup; - aes_ctr.do_cipher = ssh_aes_ctr; -#ifndef SSH_OLD_EVP - aes_ctr.flags = EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | - EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CUSTOM_IV; -#endif - return (&aes_ctr); -} - -#endif /* defined(WITH_OPENSSL) && !defined(OPENSSL_HAVE_EVPCTR) */ diff --git a/cipher.c b/cipher.c index 623f6afcd..02aea4089 100644 --- a/cipher.c +++ b/cipher.c @@ -485,11 +485,6 @@ cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, size_t len) return SSH_ERR_LIBCRYPTO_ERROR; if ((size_t)evplen != len) return SSH_ERR_INVALID_ARGUMENT; -#ifndef OPENSSL_HAVE_EVPCTR - if (c->evptype == evp_aes_128_ctr) - ssh_aes_ctr_iv(cc->evp, 0, iv, len); - else -#endif if (cipher_authlen(c)) { if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, len, iv)) @@ -519,12 +514,6 @@ cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv, size_t len) return SSH_ERR_LIBCRYPTO_ERROR; if ((size_t)evplen != len) return SSH_ERR_INVALID_ARGUMENT; -#ifndef OPENSSL_HAVE_EVPCTR - /* XXX iv arg is const, but ssh_aes_ctr_iv isn't */ - if (c->evptype == evp_aes_128_ctr) - ssh_aes_ctr_iv(cc->evp, 1, (u_char *)iv, evplen); - else -#endif if (cipher_authlen(c)) { /* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */ if (!EVP_CIPHER_CTX_ctrl(cc->evp, diff --git a/configure.ac b/configure.ac index f618300ff..922195e1b 100644 --- a/configure.ac +++ b/configure.ac @@ -2986,28 +2986,6 @@ if test "x$openssl" = "xyes" ; then ] ) - # Check for OpenSSL with EVP_aes_*ctr - AC_MSG_CHECKING([whether OpenSSL has AES CTR via EVP]) - AC_LINK_IFELSE( - [AC_LANG_PROGRAM([[ - #include - #include - #include - ]], [[ - exit(EVP_aes_128_ctr() == NULL || - EVP_aes_192_cbc() == NULL || - EVP_aes_256_cbc() == NULL); - ]])], - [ - AC_MSG_RESULT([yes]) - AC_DEFINE([OPENSSL_HAVE_EVPCTR], [1], - [libcrypto has EVP AES CTR]) - ], - [ - AC_MSG_RESULT([no]) - ] - ) - AC_MSG_CHECKING([if EVP_DigestUpdate returns an int]) AC_LINK_IFELSE( [AC_LANG_PROGRAM([[ diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h index a60df1257..61a69dd56 100644 --- a/openbsd-compat/openssl-compat.h +++ b/openbsd-compat/openssl-compat.h @@ -68,14 +68,6 @@ void ssh_libcrypto_init(void); # endif #endif -#ifndef OPENSSL_HAVE_EVPCTR -# define EVP_aes_128_ctr evp_aes_128_ctr -# define EVP_aes_192_ctr evp_aes_128_ctr -# define EVP_aes_256_ctr evp_aes_128_ctr -const EVP_CIPHER *evp_aes_128_ctr(void); -void ssh_aes_ctr_iv(EVP_CIPHER_CTX *, int, u_char *, size_t); -#endif - /* LibreSSL/OpenSSL 1.1x API compat */ #ifndef HAVE_DSA_GET0_PQG void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, From f117e372b3f42f2fbdb0a578d063b2609ab58e1f Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 22 Jul 2022 09:24:45 +1000 Subject: [PATCH 183/287] Do not link scp, sftp and sftp-server w/ zlib. Some of our binaries (eg sftp, sftp-server, scp) do not interact with the channels code and thus do use libraries such as zlib and libcrypto although they are linked with them. This adds a CHANNELLIBS and starts by moving zlib into it, which means the aformentioned binaries are no longer linked against zlib. ok djm@ --- Makefile.in | 11 ++++++----- configure.ac | 14 +++++++++----- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Makefile.in b/Makefile.in index a5c292bda..e39d62ec1 100644 --- a/Makefile.in +++ b/Makefile.in @@ -49,6 +49,7 @@ CFLAGS_NOPIE=@CFLAGS_NOPIE@ CPPFLAGS=-I. -I$(srcdir) @CPPFLAGS@ $(PATHS) @DEFS@ PICFLAG=@PICFLAG@ LIBS=@LIBS@ +CHANNELLIBS=@CHANNELLIBS@ K5LIBS=@K5LIBS@ GSSLIBS=@GSSLIBS@ SSHDLIBS=@SSHDLIBS@ @@ -208,10 +209,10 @@ libssh.a: $(LIBSSH_OBJS) $(RANLIB) $@ ssh$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHOBJS) - $(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) + $(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) $(CHANNELLIBS) sshd$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHDOBJS) - $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) + $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) scp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SCP_OBJS) $(LD) -o $@ $(SCP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) @@ -226,16 +227,16 @@ ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHKEYGEN_OBJS) $(LD) -o $@ $(SSHKEYGEN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHKEYSIGN_OBJS) - $(LD) -o $@ $(SSHKEYSIGN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) + $(LD) -o $@ $(SSHKEYSIGN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a $(P11HELPER_OBJS) $(LD) -o $@ $(P11HELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) ssh-sk-helper$(EXEEXT): $(LIBCOMPAT) libssh.a $(SKHELPER_OBJS) - $(LD) -o $@ $(SKHELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) $(LIBFIDO2) + $(LD) -o $@ $(SKHELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) $(LIBFIDO2) $(CHANNELLIBS) ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHKEYSCAN_OBJS) - $(LD) -o $@ $(SSHKEYSCAN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) + $(LD) -o $@ $(SSHKEYSCAN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(CHANNELLIBS) sftp-server$(EXEEXT): $(LIBCOMPAT) libssh.a $(SFTPSERVER_OBJS) $(LD) -o $@ $(SFTPSERVER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) diff --git a/configure.ac b/configure.ac index 922195e1b..6fa9bdc6d 100644 --- a/configure.ac +++ b/configure.ac @@ -1388,18 +1388,21 @@ AC_ARG_WITH([zlib], fi ] ) +# These libraries are needed for anything that links in the channel code. +CHANNELLIBS="" AC_MSG_CHECKING([for zlib]) if test "x${zlib}" = "xno"; then AC_MSG_RESULT([no]) else - AC_MSG_RESULT([yes]) - AC_DEFINE([WITH_ZLIB], [1], [Enable zlib]) + saved_LIBS="$LIBS" + CHANNELLIBS="$CHANNELLIBS -lz" + AC_MSG_RESULT([yes]) + AC_DEFINE([WITH_ZLIB], [1], [Enable zlib]) AC_CHECK_HEADER([zlib.h], ,[AC_MSG_ERROR([*** zlib.h missing - please install first or check config.log ***])]) - AC_CHECK_LIB([z], [deflate], , + AC_CHECK_LIB([z], [deflate], [], [ saved_CPPFLAGS="$CPPFLAGS" saved_LDFLAGS="$LDFLAGS" - save_LIBS="$LIBS" dnl Check default zlib install dir if test -n "${rpath_opt}"; then LDFLAGS="-L/usr/local/lib ${rpath_opt}/usr/local/lib ${saved_LDFLAGS}" @@ -1407,7 +1410,6 @@ else LDFLAGS="-L/usr/local/lib ${saved_LDFLAGS}" fi CPPFLAGS="-I/usr/local/include ${saved_CPPFLAGS}" - LIBS="$LIBS -lz" AC_TRY_LINK_FUNC([deflate], [AC_DEFINE([HAVE_LIBZ])], [ AC_MSG_ERROR([*** zlib missing - please install first or check config.log ***]) @@ -1464,6 +1466,7 @@ See http://www.gzip.org/zlib/ for details.]) ], [ AC_MSG_WARN([cross compiling: not checking zlib version]) ] ) + LIBS="$saved_LIBS" fi dnl UnixWare 2.x @@ -4778,6 +4781,7 @@ AC_ARG_WITH([kerberos5], ) AC_SUBST([GSSLIBS]) AC_SUBST([K5LIBS]) +AC_SUBST([CHANNELLIBS]) # Looking for programs, paths and files From d73f77b8cb9b422f1ac4facee7890aa10ff2bc21 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 22 Jul 2022 09:51:51 +1000 Subject: [PATCH 184/287] Group libcrypto and PRNGD checks together. They're related more than the libcrypt or libiaf checks which are currently between them. ok djm@ --- configure.ac | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/configure.ac b/configure.ac index 6fa9bdc6d..0044e4fed 100644 --- a/configure.ac +++ b/configure.ac @@ -3224,26 +3224,6 @@ AC_CHECK_FUNCS([ \ arc4random_stir \ arc4random_uniform \ ]) - -saved_LIBS="$LIBS" -AC_CHECK_LIB([iaf], [ia_openinfo], [ - LIBS="$LIBS -liaf" - AC_CHECK_FUNCS([set_id], [SSHDLIBS="$SSHDLIBS -liaf" - AC_DEFINE([HAVE_LIBIAF], [1], - [Define if system has libiaf that supports set_id]) - ]) -]) -LIBS="$saved_LIBS" - -# Check for crypt() in libcrypt. If we have it, we only need it for sshd. -saved_LIBS="$LIBS" -AC_CHECK_LIB([crypt], [crypt], [ - LIBS="-lcrypt $LIBS" - SSHDLIBS="-lcrypt $SSHDLIBS" -]) -AC_CHECK_FUNCS([crypt]) -LIBS="$saved_LIBS" - ### Configure cryptographic random number support # Check whether OpenSSL seeds itself @@ -3361,6 +3341,26 @@ else AC_MSG_ERROR([OpenSSH has no source of random numbers. Please configure OpenSSL with an entropy source or re-run configure using one of the --with-prngd-port or --with-prngd-socket options]) fi + +saved_LIBS="$LIBS" +AC_CHECK_LIB([iaf], [ia_openinfo], [ + LIBS="$LIBS -liaf" + AC_CHECK_FUNCS([set_id], [SSHDLIBS="$SSHDLIBS -liaf" + AC_DEFINE([HAVE_LIBIAF], [1], + [Define if system has libiaf that supports set_id]) + ]) +]) +LIBS="$saved_LIBS" + +# Check for crypt() in libcrypt. If we have it, we only need it for sshd. +saved_LIBS="$LIBS" +AC_CHECK_LIB([crypt], [crypt], [ + LIBS="-lcrypt $LIBS" + SSHDLIBS="-lcrypt $SSHDLIBS" +]) +AC_CHECK_FUNCS([crypt]) +LIBS="$saved_LIBS" + # Check for PAM libs PAM_MSG="no" AC_ARG_WITH([pam], From 1bdf86725b77733bb5f17c54888b88a10b2f6538 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 22 Jul 2022 10:45:47 +1000 Subject: [PATCH 185/287] Remove seed_rng calls from scp, sftp, sftp-server. These binaries don't use OpenSSL's random functions. The next step will be to stop linking them against libcrypto. ok djm@ --- scp.c | 2 -- sftp-server-main.c | 2 -- sftp.c | 2 -- 3 files changed, 6 deletions(-) diff --git a/scp.c b/scp.c index da07e64ec..f9ca5d393 100644 --- a/scp.c +++ b/scp.c @@ -455,8 +455,6 @@ main(int argc, char **argv) /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); - seed_rng(); - msetlocale(); /* Copy argv, because we modify it */ diff --git a/sftp-server-main.c b/sftp-server-main.c index 06566d36e..2c70f89bc 100644 --- a/sftp-server-main.c +++ b/sftp-server-main.c @@ -42,8 +42,6 @@ main(int argc, char **argv) /* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ sanitise_stdfd(); - seed_rng(); - if ((user_pw = getpwuid(getuid())) == NULL) { fprintf(stderr, "No user found for uid %lu\n", (u_long)getuid()); diff --git a/sftp.c b/sftp.c index c880f1661..939b8dc00 100644 --- a/sftp.c +++ b/sftp.c @@ -2406,8 +2406,6 @@ main(int argc, char **argv) sanitise_stdfd(); msetlocale(); - seed_rng(); - __progname = ssh_get_progname(argv[0]); memset(&args, '\0', sizeof(args)); args.list = NULL; From 099d6b56288b421ba38531d26dc1bd6bb685e311 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 22 Jul 2022 10:47:19 +1000 Subject: [PATCH 186/287] Move libcrypto into CHANNELLIBS. This will result in sftp, sftp-server and scp no longer being linked against libcrypto. ok djm@ --- Makefile.in | 43 ++++++++++++++++++++++--------------------- configure.ac | 7 ++++--- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/Makefile.in b/Makefile.in index e39d62ec1..668eeb892 100644 --- a/Makefile.in +++ b/Makefile.in @@ -218,19 +218,19 @@ scp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SCP_OBJS) $(LD) -o $@ $(SCP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) ssh-add$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHADD_OBJS) - $(LD) -o $@ $(SSHADD_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) + $(LD) -o $@ $(SSHADD_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-agent$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHAGENT_OBJS) - $(LD) -o $@ $(SSHAGENT_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) + $(LD) -o $@ $(SSHAGENT_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-keygen$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHKEYGEN_OBJS) - $(LD) -o $@ $(SSHKEYGEN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) + $(LD) -o $@ $(SSHKEYGEN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHKEYSIGN_OBJS) $(LD) -o $@ $(SSHKEYSIGN_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a $(P11HELPER_OBJS) - $(LD) -o $@ $(P11HELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LD) -o $@ $(P11HELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) $(CHANNELLIBS) ssh-sk-helper$(EXEEXT): $(LIBCOMPAT) libssh.a $(SKHELPER_OBJS) $(LD) -o $@ $(SKHELPER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) $(LIBFIDO2) $(CHANNELLIBS) @@ -516,26 +516,27 @@ regress-prep: ln -s `cd $(srcdir) && pwd`/regress/Makefile `pwd`/regress/Makefile REGRESSLIBS=libssh.a $(LIBCOMPAT) +TESTLIBS=$(LIBS) $(CHANNELLIBS) regress/modpipe$(EXEEXT): $(srcdir)/regress/modpipe.c $(REGRESSLIBS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/modpipe.c \ - $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) regress/setuid-allowed$(EXEEXT): $(srcdir)/regress/setuid-allowed.c $(REGRESSLIBS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/setuid-allowed.c \ - $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) regress/netcat$(EXEEXT): $(srcdir)/regress/netcat.c $(REGRESSLIBS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/netcat.c \ - $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) regress/check-perm$(EXEEXT): $(srcdir)/regress/check-perm.c $(REGRESSLIBS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/check-perm.c \ - $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) regress/mkdtemp$(EXEEXT): $(srcdir)/regress/mkdtemp.c $(REGRESSLIBS) $(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $(srcdir)/regress/mkdtemp.c \ - $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_HELPER_OBJS=\ regress/unittests/test_helper/test_helper.o \ @@ -559,7 +560,7 @@ regress/unittests/sshbuf/test_sshbuf$(EXEEXT): ${UNITTESTS_TEST_SSHBUF_OBJS} \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_SSHBUF_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_SSHKEY_OBJS=\ regress/unittests/sshkey/test_fuzz.o \ @@ -573,7 +574,7 @@ regress/unittests/sshkey/test_sshkey$(EXEEXT): ${UNITTESTS_TEST_SSHKEY_OBJS} \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_SSHKEY_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_SSHSIG_OBJS=\ sshsig.o \ @@ -584,7 +585,7 @@ regress/unittests/sshsig/test_sshsig$(EXEEXT): ${UNITTESTS_TEST_SSHSIG_OBJS} \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_SSHSIG_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_BITMAP_OBJS=\ regress/unittests/bitmap/tests.o @@ -593,7 +594,7 @@ regress/unittests/bitmap/test_bitmap$(EXEEXT): ${UNITTESTS_TEST_BITMAP_OBJS} \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_BITMAP_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_AUTHOPT_OBJS=\ regress/unittests/authopt/tests.o \ @@ -605,7 +606,7 @@ regress/unittests/authopt/test_authopt$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_AUTHOPT_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_CONVERSION_OBJS=\ regress/unittests/conversion/tests.o @@ -615,7 +616,7 @@ regress/unittests/conversion/test_conversion$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_CONVERSION_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_KEX_OBJS=\ regress/unittests/kex/tests.o \ @@ -626,7 +627,7 @@ regress/unittests/kex/test_kex$(EXEEXT): ${UNITTESTS_TEST_KEX_OBJS} \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_KEX_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_HOSTKEYS_OBJS=\ regress/unittests/hostkeys/tests.o \ @@ -638,7 +639,7 @@ regress/unittests/hostkeys/test_hostkeys$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_HOSTKEYS_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_MATCH_OBJS=\ regress/unittests/match/tests.o @@ -648,7 +649,7 @@ regress/unittests/match/test_match$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_MATCH_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_MISC_OBJS=\ regress/unittests/misc/tests.o \ @@ -664,7 +665,7 @@ regress/unittests/misc/test_misc$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_MISC_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) UNITTESTS_TEST_UTF8_OBJS=\ regress/unittests/utf8/tests.o @@ -674,7 +675,7 @@ regress/unittests/utf8/test_utf8$(EXEEXT): \ regress/unittests/test_helper/libtest_helper.a libssh.a $(LD) -o $@ $(LDFLAGS) $(UNITTESTS_TEST_UTF8_OBJS) \ regress/unittests/test_helper/libtest_helper.a \ - -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) + -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(TESTLIBS) # These all need to be compiled -fPIC, so they are treated differently. SK_DUMMY_OBJS=\ @@ -689,7 +690,7 @@ SK_DUMMY_LIBRARY=@SK_DUMMY_LIBRARY@ regress/misc/sk-dummy/sk-dummy.so: $(SK_DUMMY_OBJS) $(CC) $(CFLAGS) $(CPPFLAGS) $(PICFLAG) -shared -o $@ $(SK_DUMMY_OBJS) \ - -L. -Lopenbsd-compat -lopenbsd-compat $(LDFLAGS_NOPIE) $(LIBS) + -L. -Lopenbsd-compat -lopenbsd-compat $(LDFLAGS_NOPIE) $(TESTLIBS) regress-binaries: regress-prep $(LIBCOMPAT) \ regress/modpipe$(EXEEXT) \ diff --git a/configure.ac b/configure.ac index 0044e4fed..33f9b5f9e 100644 --- a/configure.ac +++ b/configure.ac @@ -2702,8 +2702,10 @@ AC_ARG_WITH([ssl-engine], ] ) +nocrypto_saved_LIBS="$LIBS" if test "x$openssl" = "xyes" ; then LIBS="-lcrypto $LIBS" + CHANNELLIBS="-lcrypto $CHANNELLIBS" AC_TRY_LINK_FUNC([RAND_add], , [AC_MSG_ERROR([*** working libcrypto not found, check config.log])]) AC_CHECK_HEADER([openssl/opensslv.h], , @@ -2874,7 +2876,6 @@ if test "x$openssl" = "xyes" ; then ], [ AC_MSG_RESULT([no]) - saved_LIBS="$LIBS" LIBS="$LIBS -ldl" AC_MSG_CHECKING([if programs using OpenSSL need -ldl]) AC_LINK_IFELSE( @@ -2882,10 +2883,10 @@ if test "x$openssl" = "xyes" ; then [[ ERR_load_crypto_strings(); ]])], [ AC_MSG_RESULT([yes]) + CHANNELLIBS="$CHANNELLIBS -ldl" ], [ AC_MSG_RESULT([no]) - LIBS="$saved_LIBS" ] ) ] @@ -3340,7 +3341,7 @@ elif test "x$openssl" = "xno" ; then else AC_MSG_ERROR([OpenSSH has no source of random numbers. Please configure OpenSSL with an entropy source or re-run configure using one of the --with-prngd-port or --with-prngd-socket options]) fi - +LIBS="$nocrypto_saved_LIBS" saved_LIBS="$LIBS" AC_CHECK_LIB([iaf], [ia_openinfo], [ From 722a56439aa5972c830e4a9a724cf52aff4a950a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 27 Jul 2022 18:31:14 +1000 Subject: [PATCH 187/287] Move stale-configure check as early as possible. We added a check in Makefile to catch the case where configure needs to be rebuilt, however this did not happen until a build was attempted in which case all of the work done by configure was wasted. Move this check to the start of configure to catch it as early as possible. ok djm@ --- Makefile.in | 7 +------ configure.ac | 8 ++++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Makefile.in b/Makefile.in index 668eeb892..778c66cff 100644 --- a/Makefile.in +++ b/Makefile.in @@ -185,16 +185,11 @@ FIXPATHSCMD = $(SED) $(PATHSUBS) FIXALGORITHMSCMD= $(SHELL) $(srcdir)/fixalgorithms $(SED) \ @UNSUPPORTED_ALGORITHMS@ -all: configure-check $(CONFIGFILES) $(MANPAGES) $(TARGETS) +all: $(CONFIGFILES) $(MANPAGES) $(TARGETS) $(LIBSSH_OBJS): Makefile.in config.h $(SSHOBJS): Makefile.in config.h $(SSHDOBJS): Makefile.in config.h -configure-check: $(srcdir)/configure - -$(srcdir)/configure: configure.ac $(srcdir)/m4/*.m4 - @echo "ERROR: configure is out of date; please run ${AUTORECONF} (and configure)" 1>&2 - @exit 1 .c.o: $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@ diff --git a/configure.ac b/configure.ac index 33f9b5f9e..87fad7084 100644 --- a/configure.ac +++ b/configure.ac @@ -16,6 +16,14 @@ AC_INIT([OpenSSH], [Portable], [openssh-unix-dev@mindrot.org]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([ssh.c]) + +# Check for stale configure as early as possible. +for i in $srcdir/configure.ac $srcdir/m4/*.m4; do + if test "$i" -nt "$srcdir/configure"; then + AC_MSG_ERROR([$i newer than configure, run autoreconf]) + fi +done + AC_LANG([C]) AC_CONFIG_HEADERS([config.h]) From dba7099ffcba3ca07b3946f017ba6a4c3158d9b1 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 27 Jul 2022 18:40:12 +1000 Subject: [PATCH 188/287] Remove deprecated MacOS 10.15 runners. --- .github/workflows/c-cpp.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 468d986a8..8f6bd75e4 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: # First we test all OSes in the default configuration. - os: [ubuntu-20.04, ubuntu-18.04, macos-10.15, macos-11, macos-12] + os: [ubuntu-20.04, ubuntu-18.04, macos-11, macos-12] configs: [default] # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. @@ -75,7 +75,6 @@ jobs: - { os: ubuntu-18.04, configs: selinux } - { os: ubuntu-18.04, configs: kitchensink } - { os: ubuntu-18.04, configs: without-openssl } - - { os: macos-10.15, configs: pam } - { os: macos-11, configs: pam } - { os: macos-12, configs: pam } runs-on: ${{ matrix.os }} From 141535b904b6fba01724444f38193a8599201f82 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 1 Aug 2022 11:09:26 +0000 Subject: [PATCH 189/287] upstream: avoid double-free in error path introduced in r1.70; report and fix based on GHPR#332 by v-rzh ok dtucker@ OpenBSD-Commit-ID: 3d21aa127b1f37cfc5bdc21461db369a663a951f --- ssh-keysign.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ssh-keysign.c b/ssh-keysign.c index c52321e22..b989f5e94 100644 --- a/ssh-keysign.c +++ b/ssh-keysign.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keysign.c,v 1.70 2022/01/06 22:00:18 djm Exp $ */ +/* $OpenBSD: ssh-keysign.c,v 1.71 2022/08/01 11:09:26 djm Exp $ */ /* * Copyright (c) 2002 Markus Friedl. All rights reserved. * @@ -155,9 +155,7 @@ valid_request(struct passwd *pw, char *host, struct sshkey **ret, char **pkalgp, debug3_f("fail %d", fail); - if (fail) - sshkey_free(key); - else { + if (!fail) { if (ret != NULL) { *ret = key; key = NULL; From 9385d277b787403be9dfcb229cf372202496d2f3 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 4 Aug 2022 18:55:48 +1000 Subject: [PATCH 190/287] Include CHANNEL and FIDO2 libs in configure output --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index 87fad7084..e49e163b0 100644 --- a/configure.ac +++ b/configure.ac @@ -5607,6 +5607,12 @@ echo " Compiler flags: ${CFLAGS}" echo "Preprocessor flags: ${CPPFLAGS}" echo " Linker flags: ${LDFLAGS}" echo " Libraries: ${LIBS}" +if test ! -z "${CHANNELLIBS}"; then +echo " +for channels: ${CHANNELLIBS}" +fi +if test ! -z "${LIBFIDO2}"; then +echo " +for FIDO2: ${LIBFIDO2}" +fi if test ! -z "${SSHDLIBS}"; then echo " +for sshd: ${SSHDLIBS}" fi From 3d3a932a019aedfb891e0779bb4990cd5008a390 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 5 Aug 2022 13:12:27 +1000 Subject: [PATCH 191/287] Factor out getrnd() and rename to getentropy(). Factor out the arc4random seeding into its own file and change the interface to match getentropy. Use native getentropy if available. This will make it easier to resync OpenBSD changes to arc4random. Prompted by bz#3467, ok djm@. --- configure.ac | 3 +- openbsd-compat/Makefile.in | 1 + openbsd-compat/arc4random.c | 56 +--------------------- openbsd-compat/bsd-getentropy.c | 82 +++++++++++++++++++++++++++++++++ openbsd-compat/openbsd-compat.h | 4 ++ 5 files changed, 91 insertions(+), 55 deletions(-) create mode 100644 openbsd-compat/bsd-getentropy.c diff --git a/configure.ac b/configure.ac index e49e163b0..c36aee2c8 100644 --- a/configure.ac +++ b/configure.ac @@ -1879,6 +1879,7 @@ AC_CHECK_FUNCS([ \ futimes \ getaddrinfo \ getcwd \ + getentropy \ getgrouplist \ getline \ getnameinfo \ @@ -2110,7 +2111,7 @@ AC_CHECK_DECLS([O_NONBLOCK], , , #endif ]) -AC_CHECK_DECLS([ftruncate], , , +AC_CHECK_DECLS([ftruncate, getentropy], , , [ #include #include diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in index bca8c42a5..cebe4fe45 100644 --- a/openbsd-compat/Makefile.in +++ b/openbsd-compat/Makefile.in @@ -70,6 +70,7 @@ COMPAT= arc4random.o \ bsd-cygwin_util.o \ bsd-err.o \ bsd-flock.o \ + bsd-getentropy.o \ bsd-getline.o \ bsd-getpagesize.o \ bsd-getpeereid.o \ diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index ce5f054f1..f43b5c7cc 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -33,19 +33,10 @@ #include #include -#ifdef HAVE_SYS_RANDOM_H -# include -#endif - #ifndef HAVE_ARC4RANDOM #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b)) -#ifdef WITH_OPENSSL -#include -#include -#endif - #include "log.h" #define KEYSTREAM_ONLY @@ -83,56 +74,13 @@ _rs_init(u_char *buf, size_t n) chacha_ivsetup(&rs, buf + KEYSZ); } -#ifndef WITH_OPENSSL -# ifndef SSH_RANDOM_DEV -# define SSH_RANDOM_DEV "/dev/urandom" -# endif /* SSH_RANDOM_DEV */ -static void -getrnd(u_char *s, size_t len) -{ - int fd, save_errno; - ssize_t r; - size_t o = 0; - -#ifdef HAVE_GETRANDOM - if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len) - return; -#endif /* HAVE_GETRANDOM */ - - if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) { - save_errno = errno; - /* Try egd/prngd before giving up. */ - if (seed_from_prngd(s, len) == 0) - return; - fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, - strerror(save_errno)); - } - while (o < len) { - r = read(fd, s + o, len - o); - if (r < 0) { - if (errno == EAGAIN || errno == EINTR || - errno == EWOULDBLOCK) - continue; - fatal("read %s: %s", SSH_RANDOM_DEV, strerror(errno)); - } - o += r; - } - close(fd); -} -#endif /* WITH_OPENSSL */ - static void _rs_stir(void) { u_char rnd[KEYSZ + IVSZ]; -#ifdef WITH_OPENSSL - if (RAND_bytes(rnd, sizeof(rnd)) <= 0) - fatal("Couldn't obtain random bytes (error 0x%lx)", - (unsigned long)ERR_get_error()); -#else - getrnd(rnd, sizeof(rnd)); -#endif + if (getentropy(rnd, sizeof rnd) == -1) + fatal("getentropy failed"); if (!rs_initialized) { rs_initialized = 1; diff --git a/openbsd-compat/bsd-getentropy.c b/openbsd-compat/bsd-getentropy.c new file mode 100644 index 000000000..1733e2873 --- /dev/null +++ b/openbsd-compat/bsd-getentropy.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#ifndef HAVE_GETENTROPY + +#ifndef SSH_RANDOM_DEV +# define SSH_RANDOM_DEV "/dev/urandom" +#endif /* SSH_RANDOM_DEV */ + +#include +#ifdef HAVE_SYS_RANDOM_H +# include +#endif + +#include +#include +#include +#include +#ifdef WITH_OPENSSL +#include +#include +#endif + +#include "log.h" + +int +getentropy(void *s, size_t len) +{ +#ifdef WITH_OPENSSL + if (RAND_bytes(s, len) <= 0) + fatal("Couldn't obtain random bytes (error 0x%lx)", + (unsigned long)ERR_get_error()); +#else + int fd, save_errno; + ssize_t r; + size_t o = 0; + +#ifdef HAVE_GETRANDOM + if ((r = getrandom(s, len, 0)) > 0 && (size_t)r == len) + return 0; +#endif /* HAVE_GETRANDOM */ + + if ((fd = open(SSH_RANDOM_DEV, O_RDONLY)) == -1) { + save_errno = errno; + /* Try egd/prngd before giving up. */ + if (seed_from_prngd(s, len) == 0) + return 0; + fatal("Couldn't open %s: %s", SSH_RANDOM_DEV, + strerror(save_errno)); + } + while (o < len) { + r = read(fd, (u_char *)s + o, len - o); + if (r < 0) { + if (errno == EAGAIN || errno == EINTR || + errno == EWOULDBLOCK) + continue; + fatal("read %s: %s", SSH_RANDOM_DEV, strerror(errno)); + } + o += r; + } + close(fd); +#endif /* WITH_OPENSSL */ + return 0; +} +#endif /* WITH_GETENTROPY */ diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index 4316ab84b..93efff2f1 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -69,6 +69,10 @@ void closefrom(int); int ftruncate(int filedes, off_t length); #endif +#if defined(HAVE_DECL_GETENTROPY) && HAVE_DECL_GETENTROPY == 0 +int getentropy(void *, size_t); +#endif + #ifndef HAVE_GETLINE #include ssize_t getline(char **, size_t *, FILE *); From 78774c08cc4b4997382975b0f414a86e06b6780c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 10 Feb 2022 18:19:29 +0100 Subject: [PATCH 192/287] compat code for fido_dev_is_winhello() Signed-off-by: Corinna Vinschen --- configure.ac | 1 + sk-usbhid.c | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/configure.ac b/configure.ac index c36aee2c8..1ee96268d 100644 --- a/configure.ac +++ b/configure.ac @@ -3223,6 +3223,7 @@ if test "x$enable_sk" = "xyes" -a "x$enable_sk_internal" != "xno" ; then fido_dev_get_touch_begin \ fido_dev_get_touch_status \ fido_dev_supports_cred_prot \ + fido_dev_is_winhello \ ]) LIBS="$saved_LIBS" fi diff --git a/sk-usbhid.c b/sk-usbhid.c index 616fc5565..dfe88789a 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -381,6 +381,14 @@ fido_assert_set_clientdata(fido_assert_t *assert, const u_char *ptr, size_t len) } #endif /* HAVE_FIDO_ASSERT_SET_CLIENTDATA */ +#ifndef HAVE_FIDO_DEV_IS_WINHELLO +static bool +fido_dev_is_winhello(const fido_dev_t *) +{ + return false; +} +#endif /* HAVE_FIDO_DEV_IS_WINHELLO */ + /* Check if the specified key handle exists on a given sk. */ static int sk_try(const struct sk_usbhid *sk, const char *application, From 242c044ab111a37aad3b0775727c36a4c5f0102c Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 15 Feb 2022 11:28:08 +0100 Subject: [PATCH 193/287] check_sk_options: add temporary WinHello workaround Up to libfido 1.10.0, WinHello advertises "clientPin" rather than "uv" capability. This is fixed in 1.11.0. For the time being, workaround it here. Signed-off-by: Corinna Vinschen --- sk-usbhid.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sk-usbhid.c b/sk-usbhid.c index dfe88789a..06bf0e85c 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -450,6 +450,15 @@ check_sk_options(fido_dev_t *dev, const char *opt, int *ret) skdebug(__func__, "device is not fido2"); return 0; } + /* + * Workaround required up to libfido2 1.10.0. As soon as 1.11.0 + * is released and updated in the Cygwin release, we can drop this. + */ + if (fido_dev_is_winhello(dev) && strcmp (opt, "uv") == 0) { + skdebug(__func__, "device is winhello"); + *ret = 1; + return 0; + } if ((info = fido_cbor_info_new()) == NULL) { skdebug(__func__, "fido_cbor_info_new failed"); return -1; From 2886975c0ad9244e60dc5e4be34fde3aa573a4b5 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Fri, 11 Feb 2022 14:33:41 +0100 Subject: [PATCH 194/287] sk_sign: set FIDO2 uv attribute explicitely for WinHello WinHello via libfido2 performs user verification by default. However, if we stick to that, there's no way to differentiate between keys created with or without "-O verify-required". Set FIDO2 uv attribute explicitely to FIDO_OPT_FALSE, then check if user verification has been requested. Signed-off-by: Corinna Vinschen --- sk-usbhid.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/sk-usbhid.c b/sk-usbhid.c index 06bf0e85c..a82110efa 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1216,6 +1216,14 @@ sk_sign(uint32_t alg, const uint8_t *data, size_t datalen, skdebug(__func__, "fido_assert_set_up: %s", fido_strerr(r)); goto out; } + /* + * WinHello requests the PIN by default. Make "uv" request explicit + * to allow keys with and without -O verify-required to make sense. + */ + if (pin == NULL && fido_dev_is_winhello (sk->dev) && + (r = fido_assert_set_uv(assert, FIDO_OPT_FALSE)) != FIDO_OK) { + skdebug(__func__, "fido_assert_set_uv: %s", fido_strerr(r)); + } if (pin == NULL && (flags & SSH_SK_USER_VERIFICATION_REQD)) { if (check_sk_options(sk->dev, "uv", &internal_uv) < 0 || internal_uv != 1) { From 2a108c0ea960381bd9b14ee0d84e818a23df4482 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 5 Aug 2022 05:01:40 +0000 Subject: [PATCH 195/287] upstream: don't prompt for FIDO passphrase before attempting to enroll the credential, just let the enroll operating fail and we'll attempt to get a PIN anyway. Might avoid some unneccessary PIN prompts. Part of GHPR#302 from Corinna Vinschen; ok dtucker@ OpenBSD-Commit-ID: bd5342ffc353ee37d39617906867c305564d1ce2 --- ssh-keygen.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/ssh-keygen.c b/ssh-keygen.c index 77f790134..20b321cc4 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.457 2022/07/20 03:33:22 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.458 2022/08/05 05:01:40 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -3288,7 +3288,7 @@ usage(void) int main(int argc, char **argv) { - char comment[1024], *passphrase; + char comment[1024], *passphrase = NULL; char *rr_hostname = NULL, *ep, *fp, *ra; struct sshkey *private, *public; struct passwd *pw; @@ -3801,13 +3801,6 @@ main(int argc, char **argv) } if ((attest = sshbuf_new()) == NULL) fatal("sshbuf_new failed"); - if ((sk_flags & - (SSH_SK_USER_VERIFICATION_REQD|SSH_SK_RESIDENT_KEY))) { - passphrase = read_passphrase("Enter PIN for " - "authenticator: ", RP_ALLOW_STDIN); - } else { - passphrase = NULL; - } r = 0; for (i = 0 ;;) { if (!quiet) { From 73541f29f0b50480da6c20dceb7a7191bd8ea7d3 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 8 Aug 2022 10:30:34 +1000 Subject: [PATCH 196/287] Give unused param a name. Fixes builds on platforms that do have fido2 but don't have fido_dev_is_winhello. --- openbsd-compat/Makefile.in | 7 ++-- openbsd-compat/arc4random_uniform.c | 64 +++++++++++++++++++++++++++++ openbsd-compat/openbsd-compat.h | 2 +- sk-usbhid.c | 2 +- 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 openbsd-compat/arc4random_uniform.c diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in index cebe4fe45..016f493e4 100644 --- a/openbsd-compat/Makefile.in +++ b/openbsd-compat/Makefile.in @@ -17,7 +17,9 @@ INSTALL=@INSTALL@ LDFLAGS=-L. @LDFLAGS@ LDFLAGS_NOPIE=-L. -Lopenbsd-compat/ @LDFLAGS_NOPIE@ -OPENBSD=base64.o \ +OPENBSD=arc4random.o \ + arc4random_uniform.o \ + base64.o \ basename.o \ bcrypt_pbkdf.o \ bindresvport.o \ @@ -64,8 +66,7 @@ OPENBSD=base64.o \ timingsafe_bcmp.o \ vis.o -COMPAT= arc4random.o \ - bsd-asprintf.o \ +COMPAT= bsd-asprintf.o \ bsd-closefrom.o \ bsd-cygwin_util.o \ bsd-err.o \ diff --git a/openbsd-compat/arc4random_uniform.c b/openbsd-compat/arc4random_uniform.c new file mode 100644 index 000000000..1dfec8f6c --- /dev/null +++ b/openbsd-compat/arc4random_uniform.c @@ -0,0 +1,64 @@ +/* OPENBSD ORIGINAL: lib/libc/crypt/arc4random_uniform.c */ + +/* $OpenBSD: arc4random_uniform.c,v 1.3 2019/01/20 02:59:07 bcook Exp $ */ + +/* + * Copyright (c) 2008, Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "includes.h" + +#include +#ifdef HAVE_STDINT_H +# include +#endif + +#ifndef HAVE_ARC4RANDOM_UNIFORM +/* + * Calculate a uniformly distributed random number less than upper_bound + * avoiding "modulo bias". + * + * Uniformity is achieved by generating new random numbers until the one + * returned is outside the range [0, 2**32 % upper_bound). This + * guarantees the selected random number will be inside + * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) + * after reduction modulo upper_bound. + */ +uint32_t +arc4random_uniform(uint32_t upper_bound) +{ + uint32_t r, min; + + if (upper_bound < 2) + return 0; + + /* 2**32 % x == (2**32 - x) % x */ + min = -upper_bound % upper_bound; + + /* + * This could theoretically loop forever but each retry has + * p > 0.5 (worst case, usually far better) of selecting a + * number inside the range we need, so it should rarely need + * to re-roll. + */ + for (;;) { + r = arc4random(); + if (r >= min) + break; + } + + return r % upper_bound; +} +#endif /* !HAVE_ARC4RANDOM_UNIFORM */ diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index 93efff2f1..1835a9a54 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -232,7 +232,7 @@ void arc4random_buf(void *, size_t); #endif #ifndef HAVE_ARC4RANDOM_UNIFORM -u_int32_t arc4random_uniform(u_int32_t); +uint32_t arc4random_uniform(uint32_t); #endif #ifndef HAVE_ASPRINTF diff --git a/sk-usbhid.c b/sk-usbhid.c index a82110efa..8e0e43eee 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -383,7 +383,7 @@ fido_assert_set_clientdata(fido_assert_t *assert, const u_char *ptr, size_t len) #ifndef HAVE_FIDO_DEV_IS_WINHELLO static bool -fido_dev_is_winhello(const fido_dev_t *) +fido_dev_is_winhello(const fido_dev_t *fdev) { return false; } From 7a01f61be8d0aca0e975e7417f26371495fe7674 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Mon, 8 Aug 2022 12:17:04 +1000 Subject: [PATCH 197/287] Actually put HAVE_STDINT_H around the stdint.h. --- openbsd-compat/arc4random_uniform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openbsd-compat/arc4random_uniform.c b/openbsd-compat/arc4random_uniform.c index 1dfec8f6c..b1a8aeea2 100644 --- a/openbsd-compat/arc4random_uniform.c +++ b/openbsd-compat/arc4random_uniform.c @@ -20,10 +20,10 @@ #include "includes.h" -#include #ifdef HAVE_STDINT_H -# include +# include #endif +#include #ifndef HAVE_ARC4RANDOM_UNIFORM /* From 7e2f51940ba48a1c0fae1107801ea643fa83c971 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 10 Aug 2022 17:25:24 +1000 Subject: [PATCH 198/287] Rename our getentropy to prevent possible loops. Since arc4random seeds from getentropy, and we use OpenSSL for that if enabled, there's the possibility that if we build on a system that does not have getentropy then run on a system that does have it, then OpenSSL could end up calling our getentropy and getting stuck in a loop. Pointed out by deraadt@, ok djm@ --- openbsd-compat/arc4random.c | 9 +++++++++ openbsd-compat/bsd-getentropy.c | 2 +- openbsd-compat/openbsd-compat.h | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index f43b5c7cc..2f91c2b2b 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -35,6 +35,15 @@ #ifndef HAVE_ARC4RANDOM +/* + * If we're not using a native getentropy, use the one from bsd-getentropy.c + * under a different name, so that if in future these binaries are run on + * a system that has a native getentropy OpenSSL cannot call the wrong one. + */ +#ifndef HAVE_GETENTROPY +# define getentropy(x, y) (_ssh_compat_getentropy((x), (y))) +#endif + #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b)) #include "log.h" diff --git a/openbsd-compat/bsd-getentropy.c b/openbsd-compat/bsd-getentropy.c index 1733e2873..bd4b6695a 100644 --- a/openbsd-compat/bsd-getentropy.c +++ b/openbsd-compat/bsd-getentropy.c @@ -41,7 +41,7 @@ #include "log.h" int -getentropy(void *s, size_t len) +_ssh_compat_getentropy(void *s, size_t len) { #ifdef WITH_OPENSSL if (RAND_bytes(s, len) <= 0) diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index 1835a9a54..3e2ebb60a 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -70,7 +70,7 @@ int ftruncate(int filedes, off_t length); #endif #if defined(HAVE_DECL_GETENTROPY) && HAVE_DECL_GETENTROPY == 0 -int getentropy(void *, size_t); +int _ssh_compat_getentropy(void *, size_t); #endif #ifndef HAVE_GETLINE From fdbd5bf507fc271ff813714fab8a72ff2c6cb5ca Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 10 Aug 2022 17:35:52 +1000 Subject: [PATCH 199/287] Test hostbased auth on github runners. --- .github/run_test.sh | 14 ++++++++++++++ .github/workflows/c-cpp.yml | 1 + 2 files changed, 15 insertions(+) diff --git a/.github/run_test.sh b/.github/run_test.sh index adf2568ad..7ea216b8c 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -6,6 +6,20 @@ set -ex +# If we want to test hostbased auth, set up the host for it. +if [ ! -z "$SUDO" ] && [ ! -x "$TEST_SSH_HOSTBASED_AUTH" ]; then + sshconf=/usr/local/etc + hostname | $SUDO tee $sshconf/shosts.equiv >/dev/null + echo "EnableSSHKeysign yes" | $SUDO tee $sshconf/ssh_config >/dev/null + $SUDO mkdir -p $sshconf + $SUDO cp -p /etc/ssh/ssh_host*key* $sshconf + $SUDO make install + for key in $sshconf/ssh_host*key*.pub; do + echo `hostname` `cat $key` | \ + $SUDO tee -a $sshconf/ssh_known_hosts >/dev/null + done +fi + output_failed_logs() { for i in regress/failed*; do if [ -f "$i" ]; then diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 8f6bd75e4..0ff56f03c 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -99,6 +99,7 @@ jobs: run: ./.github/run_test.sh ${{ matrix.configs }} env: TEST_SSH_UNSAFE_PERMISSIONS: 1 + TEST_SSH_HOSTBASED_AUTH: yes - name: save logs if: failure() uses: actions/upload-artifact@v2 From 2580916e48721802220c61ce9e0df1297c00bc07 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Thu, 11 Aug 2022 08:58:28 +1000 Subject: [PATCH 200/287] fix SANDBOX_SECCOMP_FILTER_DEBUG --- sandbox-seccomp-filter.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sandbox-seccomp-filter.c b/sandbox-seccomp-filter.c index 4ce80cb2a..9929bdb68 100644 --- a/sandbox-seccomp-filter.c +++ b/sandbox-seccomp-filter.c @@ -23,17 +23,20 @@ * E.g. * auditctl -a task,always -F uid= */ -/* #define SANDBOX_SECCOMP_FILTER_DEBUG 1 */ - -/* XXX it should be possible to do logging via the log socket safely */ +#define SANDBOX_SECCOMP_FILTER_DEBUG 1 +#if 0 +/* + * For older toolchains, it may be necessary to use the kernel + * headers directly. + */ #ifdef SANDBOX_SECCOMP_FILTER_DEBUG -/* Use the kernel headers in case of an older toolchain. */ # include # define __have_siginfo_t 1 # define __have_sigval_t 1 # define __have_sigevent_t 1 #endif /* SANDBOX_SECCOMP_FILTER_DEBUG */ +#endif #include "includes.h" @@ -362,7 +365,7 @@ ssh_sandbox_init(struct monitor *monitor) #ifdef SANDBOX_SECCOMP_FILTER_DEBUG extern struct monitor *pmonitor; -void mm_log_handler(LogLevel level, const char *msg, void *ctx); +void mm_log_handler(LogLevel level, int forced, const char *msg, void *ctx); static void ssh_sandbox_violation(int signum, siginfo_t *info, void *void_context) @@ -372,7 +375,7 @@ ssh_sandbox_violation(int signum, siginfo_t *info, void *void_context) snprintf(msg, sizeof(msg), "%s: unexpected system call (arch:0x%x,syscall:%d @ %p)", __func__, info->si_arch, info->si_syscall, info->si_call_addr); - mm_log_handler(SYSLOG_LEVEL_FATAL, msg, pmonitor); + mm_log_handler(SYSLOG_LEVEL_FATAL, 0, msg, pmonitor); _exit(1); } From 4df246ec75751da7eb925e1880498300d8bda187 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 11 Aug 2022 10:23:55 +1000 Subject: [PATCH 201/287] Fix conditional for running hostbased tests. --- .github/run_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/run_test.sh b/.github/run_test.sh index 7ea216b8c..8eeaf5e9b 100755 --- a/.github/run_test.sh +++ b/.github/run_test.sh @@ -7,7 +7,7 @@ set -ex # If we want to test hostbased auth, set up the host for it. -if [ ! -z "$SUDO" ] && [ ! -x "$TEST_SSH_HOSTBASED_AUTH" ]; then +if [ ! -z "$SUDO" ] && [ ! -z "$TEST_SSH_HOSTBASED_AUTH" ]; then sshconf=/usr/local/etc hostname | $SUDO tee $sshconf/shosts.equiv >/dev/null echo "EnableSSHKeysign yes" | $SUDO tee $sshconf/ssh_config >/dev/null From ec1ddb72a146fd66d18df9cd423517453a5d8044 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 11 Aug 2022 01:56:51 +0000 Subject: [PATCH 202/287] upstream: allow certificate validity intervals, sshsig verification times and authorized_keys expiry-time options to accept dates in the UTC time zone in addition to the default of interpreting them in the system time zone. YYYYMMDD and YYMMDDHHMM[SS] dates/times will be interpreted as UTC if suffixed with a 'Z' character. Also allow certificate validity intervals to be specified in raw seconds-since-epoch as hex value, e.g. -V 0x1234:0x4567890. This is intended for use by regress tests and other tools that call ssh-keygen as part of a CA workflow. bz3468 ok dtucker OpenBSD-Commit-ID: 454db1cdffa9fa346aea5211223a2ce0588dfe13 --- misc.c | 26 +++++++++++++--- ssh-keygen.1 | 88 ++++++++++++++++++++++++++++++++++++++-------------- ssh-keygen.c | 25 +++++++++++++-- sshd.8 | 9 +++--- 4 files changed, 113 insertions(+), 35 deletions(-) diff --git a/misc.c b/misc.c index a8e87430e..f21358037 100644 --- a/misc.c +++ b/misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: misc.c,v 1.176 2022/06/03 04:30:47 djm Exp $ */ +/* $OpenBSD: misc.c,v 1.177 2022/08/11 01:56:51 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2005-2020 Damien Miller. All rights reserved. @@ -2399,15 +2399,26 @@ parse_absolute_time(const char *s, uint64_t *tp) struct tm tm; time_t tt; char buf[32], *fmt; + const char *cp; + size_t l; + int is_utc = 0; *tp = 0; + l = strlen(s); + if (l > 1 && strcasecmp(s + l - 1, "Z") == 0) { + is_utc = 1; + l--; + } else if (l > 3 && strcasecmp(s + l - 3, "UTC") == 0) { + is_utc = 1; + l -= 3; + } /* * POSIX strptime says "The application shall ensure that there * is white-space or other non-alphanumeric characters between * any two conversion specifications" so arrange things this way. */ - switch (strlen(s)) { + switch (l) { case 8: /* YYYYMMDD */ fmt = "%Y-%m-%d"; snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2s", s, s + 4, s + 6); @@ -2427,10 +2438,15 @@ parse_absolute_time(const char *s, uint64_t *tp) } memset(&tm, 0, sizeof(tm)); - if (strptime(buf, fmt, &tm) == NULL) - return SSH_ERR_INVALID_FORMAT; - if ((tt = mktime(&tm)) < 0) + if ((cp = strptime(buf, fmt, &tm)) == NULL || *cp != '\0') return SSH_ERR_INVALID_FORMAT; + if (is_utc) { + if ((tt = timegm(&tm)) < 0) + return SSH_ERR_INVALID_FORMAT; + } else { + if ((tt = mktime(&tm)) < 0) + return SSH_ERR_INVALID_FORMAT; + } /* success */ *tp = (uint64_t)tt; return 0; diff --git a/ssh-keygen.1 b/ssh-keygen.1 index 5f4298137..6aeab1cb0 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.223 2022/06/03 03:17:42 dtucker Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.224 2022/08/11 01:56:51 djm Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 3 2022 $ +.Dd $Mdocdate: August 11 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -511,8 +511,11 @@ Print the full public key to standard output after signature verification. .It Cm verify-time Ns = Ns Ar timestamp Specifies a time to use when validating signatures instead of the current time. -The time may be specified as a date in YYYYMMDD format or a time -in YYYYMMDDHHMM[SS] format. +The time may be specified as a date or time in the YYYYMMDD[Z] or +in YYYYMMDDHHMM[SS][Z] formats. +Dates and times will be interpreted in the current system time zone unless +suffixed with a Z character, which causes them to be interpreted in the +UTC time zone. .El .Pp The @@ -603,31 +606,67 @@ A validity interval may consist of a single time, indicating that the certificate is valid beginning now and expiring at that time, or may consist of two times separated by a colon to indicate an explicit time interval. .Pp -The start time may be specified as the string +The start time may be specified as: +.Bl -bullet -compact +.It +The string .Dq always -to indicate the certificate has no specified start time, -a date in YYYYMMDD format, a time in YYYYMMDDHHMM[SS] format, -a relative time (to the current time) consisting of a minus sign followed by -an interval in the format described in the +to indicate the certificate has no specified start time. +.It +A date or time in the system time zone formatted as YYYYMMDD or +YYYYMMDDHHMM[SS]. +.It +A date or time in the UTC time zone as YYYYMMDDZ or YYYYMMDDHHMM[SS]Z. +.It +A relative time before the current system time consisting of a minus sign +followed by an interval in the format described in the TIME FORMATS section of .Xr sshd_config 5 . +.It +A raw seconds since epoch (Jan 1 1970 00:00:00 UTC) as a hexadecimal +number beginning with +.Dq 0x . +.El .Pp -The end time may be specified as a YYYYMMDD date, a YYYYMMDDHHMM[SS] time, -a relative time starting with a plus character or the string +The end time may be specified similarly to the start time: +.Bl -bullet -compact +.It +The string .Dq forever -to indicate that the certificate has no expiry date. +to indicate the certificate has no specified end time. +.It +A date or time in the system time zone formatted as YYYYMMDD or +YYYYMMDDHHMM[SS]. +.It +A date or time in the UTC time zone as YYYYMMDDZ or YYYYMMDDHHMM[SS]Z. +.It +A relative time after the current system time consisting of a plus sign +followed by an interval in the format described in the +TIME FORMATS section of +.Xr sshd_config 5 . +.It +A raw seconds since epoch (Jan 1 1970 00:00:00 UTC) as a hexadecimal +number beginning with +.Dq 0x . +.El .Pp For example: -.Dq +52w1d -(valid from now to 52 weeks and one day from now), -.Dq -4w:+4w -(valid from four weeks ago to four weeks from now), -.Dq 20100101123000:20110101123000 -(valid from 12:30 PM, January 1st, 2010 to 12:30 PM, January 1st, 2011), -.Dq -1d:20110101 -(valid from yesterday to midnight, January 1st, 2011), -.Dq -1m:forever -(valid from one minute ago and never expiring). +.Bl -tag -width Ds +.It +52w1d +Valid from now to 52 weeks and one day from now. +.It -4w:+4w +Valid from four weeks ago to four weeks from now. +.It 20100101123000:20110101123000 +Valid from 12:30 PM, January 1st, 2010 to 12:30 PM, January 1st, 2011. +.It 20100101123000Z:20110101123000Z +Similar, but interpreted in the UTC time zone rather than the system time zone. +.It -1d:20110101 +Valid from yesterday to midnight, January 1st, 2011. +.It 0x1:0x2000000000 +Valid from roughly early 1970 to May 2033. +.It -1m:forever +Valid from one minute ago and never expiring. +.El .It Fl v Verbose mode. Causes @@ -1206,7 +1245,10 @@ signature object and presented on the verification command-line must match the specified list before the key will be considered acceptable. .It Cm valid-after Ns = Ns "timestamp" Indicates that the key is valid for use at or after the specified timestamp, -which may be a date in YYYYMMDD format or a time in YYYYMMDDHHMM[SS] format. +which may be a date or time in the YYYYMMDD[Z] or YYYYMMDDHHMM[SS][Z] formats. +Dates and times will be interpreted in the current system time zone unless +suffixed with a Z character, which causes them to be interpreted in the UTC +time zone. .It Cm valid-before Ns = Ns "timestamp" Indicates that the key is valid for use at or before the specified timestamp. .El diff --git a/ssh-keygen.c b/ssh-keygen.c index 20b321cc4..9b2beda05 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.458 2022/08/05 05:01:40 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.459 2022/08/11 01:56:51 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -1916,6 +1916,21 @@ parse_relative_time(const char *s, time_t now) return now + (u_int64_t)(secs * mul); } +static void +parse_hex_u64(const char *s, uint64_t *up) +{ + char *ep; + unsigned long long ull; + + errno = 0; + ull = strtoull(s, &ep, 16); + if (*s == '\0' || *ep != '\0') + fatal("Invalid certificate time: not a number"); + if (errno == ERANGE && ull == ULONG_MAX) + fatal_fr(SSH_ERR_SYSTEM_ERROR, "Invalid certificate time"); + *up = (uint64_t)ull; +} + static void parse_cert_times(char *timespec) { @@ -1938,8 +1953,8 @@ parse_cert_times(char *timespec) /* * from:to, where - * from := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | "always" - * to := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | "forever" + * from := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | 0x... | "always" + * to := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS | 0x... | "forever" */ from = xstrdup(timespec); to = strchr(from, ':'); @@ -1951,6 +1966,8 @@ parse_cert_times(char *timespec) cert_valid_from = parse_relative_time(from, now); else if (strcmp(from, "always") == 0) cert_valid_from = 0; + else if (strncmp(from, "0x", 2) == 0) + parse_hex_u64(from, &cert_valid_from); else if (parse_absolute_time(from, &cert_valid_from) != 0) fatal("Invalid from time \"%s\"", from); @@ -1958,6 +1975,8 @@ parse_cert_times(char *timespec) cert_valid_to = parse_relative_time(to, now); else if (strcmp(to, "forever") == 0) cert_valid_to = ~(u_int64_t)0; + else if (strncmp(from, "0x", 2) == 0) + parse_hex_u64(to, &cert_valid_to); else if (parse_absolute_time(to, &cert_valid_to) != 0) fatal("Invalid to time \"%s\"", to); diff --git a/sshd.8 b/sshd.8 index 2b50514ea..8ccc5bc01 100644 --- a/sshd.8 +++ b/sshd.8 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd.8,v 1.319 2022/05/02 05:40:37 jmc Exp $ -.Dd $Mdocdate: May 2 2022 $ +.\" $OpenBSD: sshd.8,v 1.320 2022/08/11 01:56:51 djm Exp $ +.Dd $Mdocdate: August 11 2022 $ .Dt SSHD 8 .Os .Sh NAME @@ -533,8 +533,9 @@ controlled via the option. .It Cm expiry-time="timespec" Specifies a time after which the key will not be accepted. -The time may be specified as a YYYYMMDD date or a YYYYMMDDHHMM[SS] time -in the system time-zone. +The time may be specified as a YYYYMMDD[Z] date or a YYYYMMDDHHMM[SS][Z] time. +Dates and times will be interpreted in the system time zone unless suffixed +by a Z character, in which case they will be interpreted in the UTC time zone. .It Cm from="pattern-list" Specifies that in addition to public key authentication, either the canonical name of the remote host or its IP address must be present in the From b98a42afb69d60891eb0488935990df6ee571c4d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Thu, 11 Aug 2022 01:57:50 +0000 Subject: [PATCH 203/287] upstream: add some tests for parse_absolute_time(), including cases where it is forced to the UTC timezone. bz3468 ok dtucker OpenBSD-Regress-ID: ea07ca31c2f3847a38df028ca632763ae44e8759 --- regress/unittests/misc/test_convtime.c | 64 +++++++++++++++++++++++++- 1 file changed, 63 insertions(+), 1 deletion(-) diff --git a/regress/unittests/misc/test_convtime.c b/regress/unittests/misc/test_convtime.c index ef6fd77de..4794dbd9d 100644 --- a/regress/unittests/misc/test_convtime.c +++ b/regress/unittests/misc/test_convtime.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_convtime.c,v 1.2 2021/12/14 21:25:27 deraadt Exp $ */ +/* $OpenBSD: test_convtime.c,v 1.3 2022/08/11 01:57:50 djm Exp $ */ /* * Regress test for misc time conversion functions. * @@ -20,6 +20,7 @@ #include "log.h" #include "misc.h" +#include "ssherr.h" void test_convtime(void); @@ -27,6 +28,7 @@ void test_convtime(void) { char buf[1024]; + uint64_t t; TEST_START("misc_convtime"); ASSERT_INT_EQ(convtime("0"), 0); @@ -56,4 +58,64 @@ test_convtime(void) ASSERT_INT_EQ(convtime("3550w5d3h14m8s"), -1); #endif TEST_DONE(); + + /* XXX timezones/DST make verification of this tricky */ + /* XXX maybe setenv TZ and tzset() to make it unambiguous? */ + TEST_START("misc_parse_absolute_time"); + ASSERT_INT_EQ(parse_absolute_time("20000101", &t), 0); + ASSERT_INT_EQ(parse_absolute_time("200001011223", &t), 0); + ASSERT_INT_EQ(parse_absolute_time("20000101122345", &t), 0); + + /* forced UTC TZ */ + ASSERT_INT_EQ(parse_absolute_time("20000101Z", &t), 0); + ASSERT_U64_EQ(t, 946684800); + ASSERT_INT_EQ(parse_absolute_time("200001011223Z", &t), 0); + ASSERT_U64_EQ(t, 946729380); + ASSERT_INT_EQ(parse_absolute_time("20000101122345Z", &t), 0); + ASSERT_U64_EQ(t, 946729425); + ASSERT_INT_EQ(parse_absolute_time("20000101UTC", &t), 0); + ASSERT_U64_EQ(t, 946684800); + ASSERT_INT_EQ(parse_absolute_time("200001011223UTC", &t), 0); + ASSERT_U64_EQ(t, 946729380); + ASSERT_INT_EQ(parse_absolute_time("20000101122345UTC", &t), 0); + ASSERT_U64_EQ(t, 946729425); + + /* Bad month */ + ASSERT_INT_EQ(parse_absolute_time("20001301", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000001", &t), + SSH_ERR_INVALID_FORMAT); + /* Incomplete */ + ASSERT_INT_EQ(parse_absolute_time("2", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("2000", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("200001", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("2000010", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("200001010", &t), + SSH_ERR_INVALID_FORMAT); + /* Bad day, hour, minute, second */ + ASSERT_INT_EQ(parse_absolute_time("20000199", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("200001019900", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("200001010099", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000101000099", &t), + SSH_ERR_INVALID_FORMAT); + /* Invalid TZ specifier */ + ASSERT_INT_EQ(parse_absolute_time("20000101ZZ", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000101PDT", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000101U", &t), + SSH_ERR_INVALID_FORMAT); + ASSERT_INT_EQ(parse_absolute_time("20000101UTCUTC", &t), + SSH_ERR_INVALID_FORMAT); + + TEST_DONE(); } From 113fe6c77ab43769fc61e953d07cb619fd7ea54b Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 11 Aug 2022 13:33:51 +1000 Subject: [PATCH 204/287] Skip hostbased during Valgrind tests. Valgrind doesn't let ssh exec ssh-keysign (because it's setuid) so skip it during the Valgrind based tests. See https://bugs.kde.org/show_bug.cgi?id=119404 for a discussion of this (ironically there the problematic binary was ssh(1) back when it could still be setuid). --- .github/configs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/configs b/.github/configs index 48070ee75..a853c6329 100755 --- a/.github/configs +++ b/.github/configs @@ -166,8 +166,9 @@ case "$config" in case "$config" in valgrind-1) # All tests except agent-timeout (which is flaky under valgrind) - #) and slow ones that run separately to increase parallelism. - SKIP_LTESTS="agent-timeout ${tests2} ${tests3} ${tests4}" + # and hostbased (since valgrind won't let ssh exec keysign). + # Slow ones are run separately to increase parallelism. + SKIP_LTESTS="agent-timeout hostbased ${tests2} ${tests3} ${tests4}" ;; valgrind-2) LTESTS="${tests2}" From d0c4fa58594577994921b593f10037c5282597ca Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 11 Aug 2022 14:23:58 +1000 Subject: [PATCH 205/287] Rerun tests if any .github config file changes. --- .github/workflows/c-cpp.yml | 4 ++-- .github/workflows/selfhosted.yml | 2 +- .github/workflows/upstream.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 0ff56f03c..e5e07c2eb 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -3,10 +3,10 @@ name: C/C++ CI on: push: branches: [ master, ci, V_9_0 ] - paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '.github/**', 'Makefile.in', 'configure.ac' ] pull_request: branches: [ master ] - paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '.github/**', 'Makefile.in', 'configure.ac' ] jobs: ci: diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 7ce318b17..c4bd1d9b2 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -3,7 +3,7 @@ name: C/C++ CI self-hosted on: push: branches: [ master, ci, V_9_0 ] - paths: [ '**.c', '**.h', '**.m4', '**.sh', '**.yml', 'Makefile.in', 'configure.ac' ] + paths: [ '**.c', '**.h', '**.m4', '**.sh', '.github/**', 'Makefile.in', 'configure.ac' ] jobs: selfhosted: diff --git a/.github/workflows/upstream.yml b/.github/workflows/upstream.yml index 2696838c2..3cec069ed 100644 --- a/.github/workflows/upstream.yml +++ b/.github/workflows/upstream.yml @@ -3,7 +3,7 @@ name: Upstream self-hosted on: push: branches: [ master, ci ] - paths: [ '**.c', '**.h', '**.yml' ] + paths: [ '**.c', '**.h', '.github/**' ] jobs: selfhosted: From 87b0d9c1b789d3ff958ec45df2ac912e24461bae Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 11 Aug 2022 22:48:23 +1000 Subject: [PATCH 206/287] Add a timegm implementation from Heimdal via Samba. Fixes build on (at least Solaris 10). --- LICENCE | 1 + configure.ac | 1 + openbsd-compat/Makefile.in | 1 + openbsd-compat/bsd-timegm.c | 82 +++++++++++++++++++++++++++++++++ openbsd-compat/openbsd-compat.h | 4 ++ 5 files changed, 89 insertions(+) create mode 100644 openbsd-compat/bsd-timegm.c diff --git a/LICENCE b/LICENCE index 77ef57699..4b0db548a 100644 --- a/LICENCE +++ b/LICENCE @@ -231,6 +231,7 @@ OpenSSH contains no GPL code. Eric P. Allman The Regents of the University of California Constantin S. Svintsoff + Kungliga Tekniska Högskolan * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/configure.ac b/configure.ac index 1ee96268d..de60a1b1f 100644 --- a/configure.ac +++ b/configure.ac @@ -1967,6 +1967,7 @@ AC_CHECK_FUNCS([ \ swap32 \ sysconf \ tcgetpgrp \ + timegm \ timingsafe_bcmp \ truncate \ unsetenv \ diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in index 016f493e4..1d549954f 100644 --- a/openbsd-compat/Makefile.in +++ b/openbsd-compat/Makefile.in @@ -85,6 +85,7 @@ COMPAT= bsd-asprintf.o \ bsd-signal.o \ bsd-snprintf.o \ bsd-statvfs.o \ + bsd-timegm.o \ bsd-waitpid.o \ fake-rfc2553.o \ getrrsetbyname-ldns.o \ diff --git a/openbsd-compat/bsd-timegm.c b/openbsd-compat/bsd-timegm.c new file mode 100644 index 000000000..14f6bbf14 --- /dev/null +++ b/openbsd-compat/bsd-timegm.c @@ -0,0 +1,82 @@ +/* + * Copyright (c) 1997 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +/* + adapted for Samba4 by Andrew Tridgell +*/ + +#include "includes.h" + +#include + +#ifndef HAVE_TIMEGM + +static int is_leap(unsigned y) +{ + y += 1900; + return (y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0); +} + +time_t timegm(struct tm *tm) +{ + static const unsigned ndays[2][12] ={ + {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, + {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}}; + time_t res = 0; + unsigned i; + + if (tm->tm_mon > 12 || + tm->tm_mon < 0 || + tm->tm_mday > 31 || + tm->tm_min > 60 || + tm->tm_sec > 60 || + tm->tm_hour > 24) { + /* invalid tm structure */ + return 0; + } + + for (i = 70; i < tm->tm_year; ++i) + res += is_leap(i) ? 366 : 365; + + for (i = 0; i < tm->tm_mon; ++i) + res += ndays[is_leap(tm->tm_year)][i]; + res += tm->tm_mday - 1; + res *= 24; + res += tm->tm_hour; + res *= 60; + res += tm->tm_min; + res *= 60; + res += tm->tm_sec; + return res; +} +#endif /* HAVE_TIMEGM */ diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index 3e2ebb60a..bbf89825b 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -343,6 +343,10 @@ void freezero(void *, size_t); struct tm *localtime_r(const time_t *, struct tm *); #endif +#ifndef HAVE_TIMEGM +time_t timegm(struct tm *); +#endif + char *xcrypt(const char *password, const char *salt); char *shadow_pw(struct passwd *pw); From 5e820bf79ce3ce99ef7e98b0ab642b0a0a4f396c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 12 Aug 2022 14:56:55 +1000 Subject: [PATCH 207/287] Replace deprecated ubuntu-18.04 runners with 22.04 --- .github/workflows/c-cpp.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index e5e07c2eb..e79e3bc98 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: # First we test all OSes in the default configuration. - os: [ubuntu-20.04, ubuntu-18.04, macos-11, macos-12] + os: [ubuntu-20.04, ubuntu-22.04, macos-11, macos-12] configs: [default] # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. @@ -67,14 +67,14 @@ jobs: - { os: ubuntu-latest, configs: openssl-3.0.5 } - { os: ubuntu-latest, configs: openssl-1.1.1_stable } # stable branch - { os: ubuntu-latest, configs: openssl-3.0 } # stable branch - - { os: ubuntu-18.04, configs: pam } - - { os: ubuntu-18.04, configs: krb5 } - - { os: ubuntu-18.04, configs: heimdal } - - { os: ubuntu-18.04, configs: libedit } - - { os: ubuntu-18.04, configs: sk } - - { os: ubuntu-18.04, configs: selinux } - - { os: ubuntu-18.04, configs: kitchensink } - - { os: ubuntu-18.04, configs: without-openssl } + - { os: ubuntu-22.04, configs: pam } + - { os: ubuntu-22.04, configs: krb5 } + - { os: ubuntu-22.04, configs: heimdal } + - { os: ubuntu-22.04, configs: libedit } + - { os: ubuntu-22.04, configs: sk } + - { os: ubuntu-22.04, configs: selinux } + - { os: ubuntu-22.04, configs: kitchensink } + - { os: ubuntu-22.04, configs: without-openssl } - { os: macos-11, configs: pam } - { os: macos-12, configs: pam } runs-on: ${{ matrix.os }} From 730a80609472ee0451c99482d75c9c41f3ebc42d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 12 Aug 2022 05:20:28 +0000 Subject: [PATCH 208/287] upstream: sftp-server: support home-directory request Add support to the sftp-server for the home-directory extension defined in draft-ietf-secsh-filexfer-extensions-00. This overlaps a bit with the existing expand-path@openssh.com, but uses a more official protocol name, and so is a bit more likely to be implemented by non-OpenSSH clients. From Mike Frysinger, ok dtucker@ OpenBSD-Commit-ID: bfc580d05cc0c817831ae7ecbac4a481c23566ab --- PROTOCOL | 22 +++++++++++++++++++++- sftp-server.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/PROTOCOL b/PROTOCOL index f4735795c..28ad9e0b3 100644 --- a/PROTOCOL +++ b/PROTOCOL @@ -615,6 +615,26 @@ This request is identical to the "copy-data" request documented in: https://tools.ietf.org/html/draft-ietf-secsh-filexfer-extensions-00#section-7 +4.11. sftp: Extension request "home-directory" + +This request asks the server to expand the specified user's home directory. +An empty username implies the current user. This can be used by the client +to expand ~/ type paths locally. + + byte SSH_FXP_EXTENDED + uint32 id + string "home-directory" + string username + +This extension is advertised in the SSH_FXP_VERSION hello with version +"1". + +This provides similar information as the "expand-path@openssh.com" extension. + +This request is identical to the "home-directory" request documented in: + +https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-extensions-00#section-5 + 5. Miscellaneous changes 5.1 Public key format @@ -651,4 +671,4 @@ master instance and later clients. OpenSSH extends the usual agent protocol. These changes are documented in the PROTOCOL.agent file. -$OpenBSD: PROTOCOL,v 1.45 2022/04/08 05:43:39 dtucker Exp $ +$OpenBSD: PROTOCOL,v 1.46 2022/08/12 05:20:28 djm Exp $ diff --git a/sftp-server.c b/sftp-server.c index 3dd19d4c8..85f4345e9 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.140 2022/03/31 03:05:49 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.141 2022/08/12 05:20:28 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -121,6 +121,7 @@ static void process_extended_lsetstat(u_int32_t id); static void process_extended_limits(u_int32_t id); static void process_extended_expand(u_int32_t id); static void process_extended_copy_data(u_int32_t id); +static void process_extended_home_directory(u_int32_t id); static void process_extended(u_int32_t id); struct sftp_handler { @@ -167,6 +168,8 @@ static const struct sftp_handler extended_handlers[] = { { "expand-path", "expand-path@openssh.com", 0, process_extended_expand, 0 }, { "copy-data", "copy-data", 0, process_extended_copy_data, 1 }, + { "home-directory", "home-directory", 0, + process_extended_home_directory, 0 }, { NULL, NULL, 0, NULL, 0 } }; @@ -724,6 +727,7 @@ process_init(void) compose_extension(msg, "limits@openssh.com", "1"); compose_extension(msg, "expand-path@openssh.com", "1"); compose_extension(msg, "copy-data", "1"); + compose_extension(msg, "home-directory", "1"); send_msg(msg); sshbuf_free(msg); @@ -1684,6 +1688,31 @@ process_extended_copy_data(u_int32_t id) send_status(id, status); } +static void +process_extended_home_directory(u_int32_t id) +{ + char *username; + struct passwd *user_pw; + int r; + Stat s; + + if ((r = sshbuf_get_cstring(iqueue, &username, NULL)) != 0) + fatal_fr(r, "parse"); + + debug3("request %u: home-directory \"%s\"", id, username); + if ((user_pw = getpwnam(username)) == NULL) { + send_status(id, errno_to_portable(errno)); + goto out; + } + + verbose("home-directory \"%s\"", pw->pw_dir); + attrib_clear(&s.attrib); + s.name = s.long_name = pw->pw_dir; + send_names(id, 1, &s); + out: + free(username); +} + static void process_extended(u_int32_t id) { From 9468cd7cf9d989dfa2ac20e2a0268ba6e93bfa5a Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 11 Aug 2022 20:18:17 +0200 Subject: [PATCH 209/287] fido_dev_is_winhello: return 0, not "false" "false" is not used anywhere in OpenSSH, so return 0 like everywhere else. Signed-off-by: Corinna Vinschen --- sk-usbhid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 8e0e43eee..74df16ed0 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -385,7 +385,7 @@ fido_assert_set_clientdata(fido_assert_t *assert, const u_char *ptr, size_t len) static bool fido_dev_is_winhello(const fido_dev_t *fdev) { - return false; + return 0; } #endif /* HAVE_FIDO_DEV_IS_WINHELLO */ From cccb011e130cbbac538b1689d10e4a067298df8b Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Thu, 11 Aug 2022 20:19:35 +0200 Subject: [PATCH 210/287] Revert "check_sk_options: add temporary WinHello workaround" Cygwin now comes with libfido2 1.11.0, so this workaround isn't required anymore. This reverts commit 242c044ab111a37aad3b0775727c36a4c5f0102c. Signed-off-by: Corinna Vinschen --- sk-usbhid.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 74df16ed0..02cefb87a 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -450,15 +450,6 @@ check_sk_options(fido_dev_t *dev, const char *opt, int *ret) skdebug(__func__, "device is not fido2"); return 0; } - /* - * Workaround required up to libfido2 1.10.0. As soon as 1.11.0 - * is released and updated in the Cygwin release, we can drop this. - */ - if (fido_dev_is_winhello(dev) && strcmp (opt, "uv") == 0) { - skdebug(__func__, "device is winhello"); - *ret = 1; - return 0; - } if ((info = fido_cbor_info_new()) == NULL) { skdebug(__func__, "fido_cbor_info_new failed"); return -1; From edb0bcb3c79b16031dc87a8e57aecc3c4a3414f0 Mon Sep 17 00:00:00 2001 From: "jmc@openbsd.org" Date: Tue, 16 Aug 2022 20:24:08 +0000 Subject: [PATCH 211/287] upstream: use .Cm for "sign"; from josiah frentsos OpenBSD-Commit-ID: 7f80a53d54857ac6ae49ea6ad93c5bd12231d1e4 --- ssh-keygen.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index 6aeab1cb0..b31661c10 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.224 2022/08/11 01:56:51 djm Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.225 2022/08/16 20:24:08 jmc Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 11 2022 $ +.Dd $Mdocdate: August 16 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -588,7 +588,7 @@ and When used in combination with .Fl s or -.Fl Y Ar sign , +.Fl Y Cm sign , this option indicates that a CA key resides in a .Xr ssh-agent 1 . See the From 47f72f534ac5cc2cd3027675a3df7b00a8f77575 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 17 Aug 2022 06:01:57 +0000 Subject: [PATCH 212/287] upstream: add an extra flag to sk_probe() to indicate whether we're probing for a FIDO resident key or not. Unused here, but will make like easier for portable OpenBSD-Commit-ID: 432c8ff70e270378df9dbceb9bdeaa5b43b5a832 --- sk-usbhid.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 02cefb87a..1d0faebcf 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.41 2022/07/20 03:31:42 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.42 2022/08/17 06:01:57 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -564,7 +564,7 @@ out: static struct sk_usbhid * sk_probe(const char *application, const uint8_t *key_handle, - size_t key_handle_len) + size_t key_handle_len, int probe_resident) { struct sk_usbhid *sk; fido_dev_info_t *devlist; @@ -872,7 +872,7 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, if (device != NULL) sk = sk_open(device); else - sk = sk_probe(NULL, NULL, 0); + sk = sk_probe(NULL, NULL, 0, 0); if (sk == NULL) { ret = SSH_SK_ERR_DEVICE_NOT_FOUND; skdebug(__func__, "failed to find sk"); @@ -1174,9 +1174,9 @@ sk_sign(uint32_t alg, const uint8_t *data, size_t datalen, if (device != NULL) sk = sk_open(device); else if (pin != NULL || (flags & SSH_SK_USER_VERIFICATION_REQD)) - sk = sk_probe(NULL, NULL, 0); + sk = sk_probe(NULL, NULL, 0, 0); else - sk = sk_probe(application, key_handle, key_handle_len); + sk = sk_probe(application, key_handle, key_handle_len, 0); if (sk == NULL) { ret = SSH_SK_ERR_DEVICE_NOT_FOUND; skdebug(__func__, "failed to find sk"); @@ -1448,7 +1448,7 @@ sk_load_resident_keys(const char *pin, struct sk_option **options, if (device != NULL) sk = sk_open(device); else - sk = sk_probe(NULL, NULL, 0); + sk = sk_probe(NULL, NULL, 0, 1); if (sk == NULL) { ret = SSH_SK_ERR_DEVICE_NOT_FOUND; skdebug(__func__, "failed to find sk"); From cd06a76b7ccc706e2bb4f1cc4aa9e9796a28a812 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Wed, 17 Aug 2022 16:04:16 +1000 Subject: [PATCH 213/287] on Cygwin, prefer WinHello FIDO device If no FIDO device was explictly specified, then prefer the windows://hello FIDO device. An exception to this is when probing resident FIDO keys, in which case hardware FIDO devices are preferred. --- sk-usbhid.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sk-usbhid.c b/sk-usbhid.c index 1d0faebcf..8f8357332 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -571,6 +571,10 @@ sk_probe(const char *application, const uint8_t *key_handle, size_t ndevs; int r; +#ifdef HAVE_CYGWIN + if (!probe_resident && (sk = sk_open("windows://hello")) != NULL) + return sk; +#endif /* HAVE_CYGWIN */ if ((devlist = fido_dev_info_new(MAX_FIDO_DEVICES)) == NULL) { skdebug(__func__, "fido_dev_info_new failed"); return NULL; From 5a5c580b48fc6006bdfa731fc2f6d4945c2c0e4e Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Thu, 18 Aug 2022 21:36:39 +1000 Subject: [PATCH 214/287] Check for perms to run agent-getpeereid test. Ubuntu 22.04 defaults to private home dirs which prevents "nobody" running ssh-add during the agent-getpeereid test. Check for this and add the necessary permissions. --- .github/setup_ci.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index fe5e13ff0..7dec34bee 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -19,7 +19,17 @@ export DEBIAN_FRONTEND=noninteractive set -ex -lsb_release -a +if [ -x "`which lsb_release 2>&1`" ]; then + lsb_release -a +fi + +# Ubuntu 22.04 defaults to private home dirs which prevent the +# agent-getpeerid test from running ssh-add as nobody. See +# https://github.com/actions/runner-images/issues/6106 +if [ ! -z "$SUDO" ] && ! "$SUDO" -u nobody test -x ~; then + echo ~ is not executable by nobody, adding perms. + chmod go+x ~ +fi if [ "${TARGETS}" = "kitchensink" ]; then TARGETS="krb5 libedit pam sk selinux" From 5062ad48814b06162511c4f5924a33d97b6b2566 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 19 Aug 2022 03:06:30 +0000 Subject: [PATCH 215/287] upstream: double free() in error path; from Eusgor via GHPR333 OpenBSD-Commit-ID: 39f35e16ba878c8d02b4d01d8826d9b321be26d4 --- sshsig.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/sshsig.c b/sshsig.c index 1e3b63982..eb2a931e9 100644 --- a/sshsig.c +++ b/sshsig.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshsig.c,v 1.29 2022/03/30 04:27:51 djm Exp $ */ +/* $OpenBSD: sshsig.c,v 1.30 2022/08/19 03:06:30 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -491,7 +491,7 @@ hash_file(int fd, const char *hashalg, struct sshbuf **bp) { char *hex, rbuf[8192], hash[SSH_DIGEST_MAX_LENGTH]; ssize_t n, total = 0; - struct ssh_digest_ctx *ctx; + struct ssh_digest_ctx *ctx = NULL; int alg, oerrno, r = SSH_ERR_INTERNAL_ERROR; struct sshbuf *b = NULL; @@ -514,7 +514,6 @@ hash_file(int fd, const char *hashalg, struct sshbuf **bp) continue; oerrno = errno; error_f("read: %s", strerror(errno)); - ssh_digest_free(ctx); errno = oerrno; r = SSH_ERR_SYSTEM_ERROR; goto out; @@ -549,9 +548,11 @@ hash_file(int fd, const char *hashalg, struct sshbuf **bp) /* success */ r = 0; out: + oerrno = errno; sshbuf_free(b); ssh_digest_free(ctx); explicit_bzero(hash, sizeof(hash)); + errno = oerrno; return r; } From a9305c4c739f4d91a3d3a92c0b6d4949404a36c5 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 12 Aug 2022 15:08:47 +1000 Subject: [PATCH 216/287] Add Cygwin (on windows-2019) test target. In addition to installing the requisite Cygwin packages, we also need to explicitly invoke "sh" for steps that run other scripts since the runner environment doesn't understand #! paths. --- .github/configs | 7 +++++-- .github/setup_ci.sh | 7 +++++++ .github/workflows/c-cpp.yml | 18 +++++++++++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/.github/configs b/.github/configs index a853c6329..21bdf24c4 100755 --- a/.github/configs +++ b/.github/configs @@ -255,10 +255,13 @@ case "${TARGET_HOST}" in ;; esac -# Unless specified otherwise, build without OpenSSL on Mac OS since -# modern versions don't ship with libcrypto. case "`./config.guess`" in +*cygwin) + SUDO="" + ;; *-darwin*) + # Unless specified otherwise, build without OpenSSL on Mac OS since + # modern versions don't ship with libcrypto. LIBCRYPTOFLAGS="--without-openssl" TEST_TARGET=t-exec ;; diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 7dec34bee..b0657bd0c 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -3,6 +3,13 @@ . .github/configs $@ case "`./config.guess`" in +*cygwin) + echo Setting CYGWIN sustem environment variable. + setx CYGWIN "binmode" + id + chmod -R go-rw /cygdrive/d/a + umask 077 + ;; *-darwin*) brew install automake exit 0 diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index e79e3bc98..03d6a5190 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,7 +15,7 @@ jobs: fail-fast: false matrix: # First we test all OSes in the default configuration. - os: [ubuntu-20.04, ubuntu-22.04, macos-11, macos-12] + os: [ubuntu-20.04, ubuntu-22.04, macos-11, macos-12, windows-2019] configs: [default] # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. @@ -79,13 +79,21 @@ jobs: - { os: macos-12, configs: pam } runs-on: ${{ matrix.os }} steps: + - name: set cygwin git params + if: ${{ matrix.configs }} == 'windows-2019' + run: git config --global core.autocrlf input + - name: install cygwin + if: ${{ matrix.configs }} == 'windows-2019' + uses: cygwin/cygwin-install-action@master + with: + packages: autoconf, automake, cygwin-devel, gcc-core, make, openssl-devel, zlib-devel - uses: actions/checkout@v2 - name: setup CI system - run: ./.github/setup_ci.sh ${{ matrix.configs }} + run: sh ./.github/setup_ci.sh ${{ matrix.configs }} - name: autoreconf - run: autoreconf + run: sh -c autoreconf - name: configure - run: ./.github/configure.sh ${{ matrix.configs }} + run: sh ./.github/configure.sh ${{ matrix.configs }} - name: save config uses: actions/upload-artifact@v2 with: @@ -96,7 +104,7 @@ jobs: - name: make run: make -j2 - name: make tests - run: ./.github/run_test.sh ${{ matrix.configs }} + run: sh ./.github/run_test.sh ${{ matrix.configs }} env: TEST_SSH_UNSAFE_PERMISSIONS: 1 TEST_SSH_HOSTBASED_AUTH: yes From fd6ee741ab16714b7035d60aca924123ba28135a Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 19 Aug 2022 15:12:57 +1000 Subject: [PATCH 217/287] Add a bit more debug output. --- .github/setup_ci.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index b0657bd0c..0f98d7747 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -4,11 +4,13 @@ case "`./config.guess`" in *cygwin) + set -x echo Setting CYGWIN sustem environment variable. setx CYGWIN "binmode" id chmod -R go-rw /cygdrive/d/a umask 077 + set +x ;; *-darwin*) brew install automake From 1b470b9036639cef4f32fb303bb35ea0b711178d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 19 Aug 2022 15:18:09 +1000 Subject: [PATCH 218/287] Fix cygwin conditional steps. --- .github/workflows/c-cpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 03d6a5190..2c5301eda 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -80,10 +80,10 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: set cygwin git params - if: ${{ matrix.configs }} == 'windows-2019' + if: ${{ matrix.configs == 'windows-2019' }} run: git config --global core.autocrlf input - name: install cygwin - if: ${{ matrix.configs }} == 'windows-2019' + if: ${{ matrix.configs == 'windows-2019' }} uses: cygwin/cygwin-install-action@master with: packages: autoconf, automake, cygwin-devel, gcc-core, make, openssl-devel, zlib-devel From ff89b1bed80721295555bd083b173247a9c0484e Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" Date: Fri, 19 Aug 2022 04:02:46 +0000 Subject: [PATCH 219/287] upstream: Strictly enforce the maximum allowed SSH2 banner size in ssh-keyscan and prevent a one-byte buffer overflow. Patch from Qualys, ok djm@ OpenBSD-Commit-ID: 6ae664f9f4db6e8a0589425f74cd0bbf3aeef4e4 --- ssh-keyscan.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ssh-keyscan.c b/ssh-keyscan.c index d29a03b4e..d7283136c 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.145 2022/01/21 00:53:40 deraadt Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.146 2022/08/19 04:02:46 dtucker Exp $ */ /* * Copyright 1995, 1996 by David Mazieres . * @@ -490,6 +490,15 @@ congreet(int s) return; } + /* + * Read the server banner as per RFC4253 section 4.2. The "SSH-" + * protocol identification string may be preceeded by an arbitarily + * large banner which we must read and ignore. Loop while reading + * newline-terminated lines until we have one starting with "SSH-". + * The ID string cannot be longer than 255 characters although the + * preceeding banner lines may (in which case they'll be discarded + * in multiple iterations of the outer loop). + */ for (;;) { memset(buf, '\0', sizeof(buf)); bufsiz = sizeof(buf); @@ -517,6 +526,11 @@ congreet(int s) conrecycle(s); return; } + if (cp >= buf + sizeof(buf)) { + error("%s: greeting exceeds allowable length", c->c_name); + confree(s); + return; + } if (*cp != '\n' && *cp != '\r') { error("%s: bad greeting", c->c_name); confree(s); From 5453333b5d28e313284cb9aae82899704103f98d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 19 Aug 2022 05:53:28 +0000 Subject: [PATCH 220/287] upstream: remove incorrect check that can break enrolling a resident key (introduced in r1.40) OpenBSD-Commit-ID: 4cab364d518470e29e624af3d3f9ffa9c92b6f01 --- sk-usbhid.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 8f8357332..7bc11ccf4 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.42 2022/08/17 06:01:57 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.43 2022/08/19 05:53:28 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -786,10 +786,6 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, size_t i; memset(message, '\0', sizeof(message)); - if (pin == NULL) { - skdebug(__func__, "NULL pin"); - goto out; - } if ((assert = fido_assert_new()) == NULL) { skdebug(__func__, "fido_assert_new failed"); goto out; From f96480906893ed93665df8cdf9065865c51c1475 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 19 Aug 2022 06:07:47 +0000 Subject: [PATCH 221/287] upstream: attemp FIDO key signing without PIN and use the error code returned to fall back only if necessary. Avoids PIN prompts for FIDO tokens that don't require them; part of GHPR#302 OpenBSD-Commit-ID: 4f752aaf9f2e7c28bcaaf3d4f8fc290131bd038e --- sshconnect2.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/sshconnect2.c b/sshconnect2.c index 7fd5c2189..f9bd19ea7 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.359 2022/07/01 03:39:44 dtucker Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.360 2022/08/19 06:07:47 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -1235,7 +1235,7 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, u_int compat, const char *alg) { struct sshkey *sign_key = NULL, *prv = NULL; - int retried = 0, r = SSH_ERR_INTERNAL_ERROR; + int is_agent = 0, retried = 0, r = SSH_ERR_INTERNAL_ERROR; struct notifier_ctx *notifier = NULL; char *fp = NULL, *pin = NULL, *prompt = NULL; @@ -1255,6 +1255,7 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, if (id->key != NULL && (id->isprivate || (id->key->flags & SSHKEY_FLAG_EXT))) { sign_key = id->key; + is_agent = 1; } else { /* Load the private key from the file. */ if ((prv = load_identity_file(id)) == NULL) @@ -1266,34 +1267,31 @@ identity_sign(struct identity *id, u_char **sigp, size_t *lenp, goto out; } sign_key = prv; - if (sshkey_is_sk(sign_key)) { - if ((sign_key->sk_flags & - SSH_SK_USER_VERIFICATION_REQD)) { + } retry_pin: - xasprintf(&prompt, "Enter PIN for %s key %s: ", - sshkey_type(sign_key), id->filename); - pin = read_passphrase(prompt, 0); - } - if ((sign_key->sk_flags & SSH_SK_USER_PRESENCE_REQD)) { - /* XXX should batch mode just skip these? */ - if ((fp = sshkey_fingerprint(sign_key, - options.fingerprint_hash, - SSH_FP_DEFAULT)) == NULL) - fatal_f("fingerprint failed"); - notifier = notify_start(options.batch_mode, - "Confirm user presence for key %s %s", - sshkey_type(sign_key), fp); - free(fp); - } - } + /* Prompt for touch for non-agent FIDO keys that request UP */ + if (!is_agent && sshkey_is_sk(sign_key) && + (sign_key->sk_flags & SSH_SK_USER_PRESENCE_REQD)) { + /* XXX should batch mode just skip these? */ + if ((fp = sshkey_fingerprint(sign_key, + options.fingerprint_hash, SSH_FP_DEFAULT)) == NULL) + fatal_f("fingerprint failed"); + notifier = notify_start(options.batch_mode, + "Confirm user presence for key %s %s", + sshkey_type(sign_key), fp); + free(fp); } if ((r = sshkey_sign(sign_key, sigp, lenp, data, datalen, alg, options.sk_provider, pin, compat)) != 0) { debug_fr(r, "sshkey_sign"); - if (pin == NULL && !retried && sshkey_is_sk(sign_key) && + if (!retried && pin == NULL && !is_agent && + sshkey_is_sk(sign_key) && r == SSH_ERR_KEY_WRONG_PASSPHRASE) { notify_complete(notifier, NULL); notifier = NULL; + xasprintf(&prompt, "Enter PIN for %s key %s: ", + sshkey_type(sign_key), id->filename); + pin = read_passphrase(prompt, 0); retried = 1; goto retry_pin; } From 6851f4b8c3fc1b3e1114c56106e4dc31369c8513 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 19 Aug 2022 17:22:18 +1000 Subject: [PATCH 222/287] Install Cygwin packages based on OS not config. --- .github/workflows/c-cpp.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 2c5301eda..36d58a420 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -80,10 +80,10 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: set cygwin git params - if: ${{ matrix.configs == 'windows-2019' }} + if: ${{ matrix.os == 'windows-2019' }} run: git config --global core.autocrlf input - name: install cygwin - if: ${{ matrix.configs == 'windows-2019' }} + if: ${{ matrix.os == 'windows-2019' }} uses: cygwin/cygwin-install-action@master with: packages: autoconf, automake, cygwin-devel, gcc-core, make, openssl-devel, zlib-devel From 3a683a19fd116ea15ebf8aa13d02646cceb302a9 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Fri, 26 Aug 2022 14:23:55 +1000 Subject: [PATCH 223/287] initial list of allowed signers --- .git_allowed_signers | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .git_allowed_signers diff --git a/.git_allowed_signers b/.git_allowed_signers new file mode 100644 index 000000000..cc9608836 --- /dev/null +++ b/.git_allowed_signers @@ -0,0 +1,2 @@ +dtucker@dtucker.net ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKecyjh9aNmD4rb8WblA8v91JjRb0Cd2JtkzqxcggGeG +djm@mindrot.org sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBLnJo3ZVDENYZGXm5uO9lU7b0iDFq5gHpTu1MaHPWTEfPdvw+AjFQQ/q5YizuMJkXGsMdYmblJEJZYHpm9IS7ZkAAAAEc3NoOg== From 70a5de0a50e84d7250eb4e4537f765599f64c4af Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 26 Aug 2022 08:12:56 +0000 Subject: [PATCH 224/287] upstream: whitespace OpenBSD-Commit-ID: d297e4387935d4aef091c5e9432578c2e513f538 --- ssh-ed25519.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ssh-ed25519.c b/ssh-ed25519.c index 23419f3c8..4861628cb 100644 --- a/ssh-ed25519.c +++ b/ssh-ed25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-ed25519.c,v 1.9 2020/10/18 11:32:02 djm Exp $ */ +/* $OpenBSD: ssh-ed25519.c,v 1.10 2022/08/26 08:12:56 djm Exp $ */ /* * Copyright (c) 2013 Markus Friedl * @@ -83,7 +83,7 @@ ssh_ed25519_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, r = 0; out: sshbuf_free(b); - if (sig != NULL) + if (sig != NULL) freezero(sig, slen); return r; @@ -150,9 +150,9 @@ ssh_ed25519_verify(const struct sshkey *key, /* success */ r = 0; out: - if (sm != NULL) + if (sm != NULL) freezero(sm, smlen); - if (m != NULL) + if (m != NULL) freezero(m, smlen); /* NB mlen may be invalid if r != 0 */ sshbuf_free(b); free(ktype); From 92382dbe8bf9ea1225b16858f9b9b208c15c7e8d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 26 Aug 2022 08:16:27 +0000 Subject: [PATCH 225/287] upstream: whitespace OpenBSD-Commit-ID: a5d015efbfd228dc598ffdef612d2da3a579e5d8 --- sshconnect.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sshconnect.c b/sshconnect.c index dcd1036d1..7b3f260ee 100644 --- a/sshconnect.c +++ b/sshconnect.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect.c,v 1.357 2022/06/03 03:21:09 dtucker Exp $ */ +/* $OpenBSD: sshconnect.c,v 1.358 2022/08/26 08:16:27 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1334,7 +1334,7 @@ check_host_key(char *hostname, const struct ssh_conn_info *cinfo, if (options.exit_on_forward_failure && cancelled_forwarding) fatal("Error: forwarding disabled due to host key " "check failure"); - + /* * XXX Should permit the user to change to use the new id. * This could be done by converting the host key to an From 85e1a69243f12be8520438ad6a3cfdc0b7fcbb2d Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 26 Aug 2022 16:26:06 +1000 Subject: [PATCH 226/287] Add cygwin-release test target. This also moves the cygwin package install from the workflow file to setup_ci.sh so that we can install different sets of Cygwin packages for different test configs. --- .github/configs | 4 +++- .github/setup_ci.sh | 43 ++++++++++++++++++++++++++++--------- .github/workflows/c-cpp.yml | 3 +-- 3 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/configs b/.github/configs index 21bdf24c4..c068f5d8d 100755 --- a/.github/configs +++ b/.github/configs @@ -34,7 +34,9 @@ case "$config" in TEST_TARGET=t-exec ;; cygwin-release) - CONFIGFLAGS="--with-libedit --with-xauth=/usr/bin/xauth --disable-strip --with-security-key-builtin" + # See https://cygwin.com/git/?p=git/cygwin-packages/openssh.git;a=blob;f=openssh.cygport;hb=HEAD + CONFIGFLAGS="--with-xauth=/usr/bin/xauth --with-security-key-builtin" + CONFIGFLAGS="$CONFIGFLAGS --with-kerberos5=/usr --with-libedit --disable-strip" ;; clang-12-Werror) CC="clang-12" diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 0f98d7747..05e1d7b8b 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -1,26 +1,30 @@ #!/bin/sh +PACKAGES="" + . .github/configs $@ case "`./config.guess`" in *cygwin) - set -x + PACKAGER=setup echo Setting CYGWIN sustem environment variable. setx CYGWIN "binmode" - id chmod -R go-rw /cygdrive/d/a umask 077 - set +x + PACKAGES="$PACKAGES,autoconf,automake,cygwin-devel,gcc-core" + PACKAGES="$PACKAGES,make,openssl-devel,zlib-devel" ;; *-darwin*) + PACKAGER=brew brew install automake exit 0 ;; +*) + PACKAGER=apt esac TARGETS=$@ -PACKAGES="" INSTALL_FIDO_PPA="no" export DEBIAN_FRONTEND=noninteractive @@ -46,19 +50,22 @@ fi for flag in $CONFIGFLAGS; do case "$flag" in - --with-pam) PACKAGES="${PACKAGES} libpam0g-dev" ;; - --with-libedit) PACKAGES="${PACKAGES} libedit-dev" ;; + --with-pam) TARGETS="${TARGETS} pam" ;; + --with-libedit) TARGETS="${TARGETS} libedit" ;; esac done for TARGET in $TARGETS; do case $TARGET in - default|without-openssl|without-zlib|c89|libedit|*pam) + default|without-openssl|without-zlib|c89) # nothing to do ;; clang-sanitize*) PACKAGES="$PACKAGES clang-12" ;; + cygwin-release) + PACKAGES="$PACKAGES libfido2-devel libkrb5-devel" + ;; gcc-sanitize*) ;; clang-*|gcc-*) @@ -71,6 +78,15 @@ for TARGET in $TARGETS; do heimdal) PACKAGES="$PACKAGES heimdal-dev" ;; + libedit) + case "$PACKAGER" in + setup) PACKAGES="$PACKAGES libedit-devel" ;; + apt) PACKAGES="$PACKAGES libedit-dev" ;; + esac + ;; + *pam) + PACKAGES="$PACKAGES libpam0g-dev" + ;; sk) INSTALL_FIDO_PPA="yes" PACKAGES="$PACKAGES libfido2-dev libu2f-host-dev libcbor-dev" @@ -123,9 +139,16 @@ if [ "yes" = "$INSTALL_FIDO_PPA" ]; then sudo apt-add-repository -y ppa:yubico/stable fi -if [ "x" != "x$PACKAGES" ]; then - sudo apt update -qq - sudo apt install -qy $PACKAGES +if [ "x" != "x$PACKAGES" ]; then + case "$PACKAGER" in + apt) + sudo apt update -qq + sudo apt install -qy $PACKAGES + ;; + setup) + /cygdrive/c/setup.exe -q -P `echo "$PACKAGES" | tr ' ' ,` + ;; + esac fi if [ "${INSTALL_HARDENED_MALLOC}" = "yes" ]; then diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 36d58a420..ec2460611 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -20,6 +20,7 @@ jobs: # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. include: + - { os: windows-2019, configs: cygwin-release } - { os: ubuntu-20.04, configs: valgrind-1 } - { os: ubuntu-20.04, configs: valgrind-2 } - { os: ubuntu-20.04, configs: valgrind-3 } @@ -85,8 +86,6 @@ jobs: - name: install cygwin if: ${{ matrix.os == 'windows-2019' }} uses: cygwin/cygwin-install-action@master - with: - packages: autoconf, automake, cygwin-devel, gcc-core, make, openssl-devel, zlib-devel - uses: actions/checkout@v2 - name: setup CI system run: sh ./.github/setup_ci.sh ${{ matrix.configs }} From 9f81736cf16dd8dda1c8942f1973a5f80b8cd78c Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 27 Aug 2022 09:37:40 +1000 Subject: [PATCH 227/287] Add Windows 2022 test targets. --- .github/workflows/c-cpp.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index ec2460611..3cd1188fc 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -15,12 +15,13 @@ jobs: fail-fast: false matrix: # First we test all OSes in the default configuration. - os: [ubuntu-20.04, ubuntu-22.04, macos-11, macos-12, windows-2019] + os: [ubuntu-20.04, ubuntu-22.04, macos-11, macos-12, windows-2019, windows-2022] configs: [default] # Then we include any extra configs we want to test for specific VMs. # Valgrind slows things down quite a bit, so start them first. include: - { os: windows-2019, configs: cygwin-release } + - { os: windows-2022, configs: cygwin-release } - { os: ubuntu-20.04, configs: valgrind-1 } - { os: ubuntu-20.04, configs: valgrind-2 } - { os: ubuntu-20.04, configs: valgrind-3 } @@ -81,10 +82,10 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: set cygwin git params - if: ${{ matrix.os == 'windows-2019' }} + if: ${{ startsWith(matrix.os, 'windows') }} run: git config --global core.autocrlf input - name: install cygwin - if: ${{ matrix.os == 'windows-2019' }} + if: ${{ startsWith(matrix.os, 'windows') }} uses: cygwin/cygwin-install-action@master - uses: actions/checkout@v2 - name: setup CI system From 51b345f177ae981b8755f6bdf8358b1cc5e83d67 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Sat, 27 Aug 2022 21:49:27 +1000 Subject: [PATCH 228/287] Add libcrypt-devel to cygwin-release deps. Based on feedback from vinschen at redhat.com. --- .github/setup_ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index 05e1d7b8b..044c4d129 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -64,7 +64,7 @@ for TARGET in $TARGETS; do PACKAGES="$PACKAGES clang-12" ;; cygwin-release) - PACKAGES="$PACKAGES libfido2-devel libkrb5-devel" + PACKAGES="$PACKAGES libcrypt-devel libfido2-devel libkrb5-devel" ;; gcc-sanitize*) ;; From 2b02dcb505288c462d1b5dd1ac04e603d01340eb Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Aug 2022 13:23:43 +1000 Subject: [PATCH 229/287] cross-sign allowed_signers with PGP key Provides continuity of trust from legacy PGP release key to the SSHSIG signing keys that we will use henceforth for git signing. --- .git_allowed_signers.asc | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .git_allowed_signers.asc diff --git a/.git_allowed_signers.asc b/.git_allowed_signers.asc new file mode 100644 index 000000000..192752994 --- /dev/null +++ b/.git_allowed_signers.asc @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmMMMQAACgkQKj9BTnNg +YLrlJBAAlih7AHfnLlo9SJ0zTV2TrjNbD71H4qM3/zZD8rg3rmRIf+J1/Nm9YwgO +tZERifvJ+FUoKX8upLAnektO66r50gO+7YMN5K+3Ap/NJ4V0QT94u8EQj3anqiKB +UraLxv6rJnI3Q4MG5rfyN34ypb9MRVe/8e1kqaL5NxMf+MMIaamQ0+xh2X7Ra+eX +WR3Jw7h+fTWr0BAbF5Mj/2BwMp4bHBEbxjM7D8cjpPsVGHHHuTpGzbAJXdLYkPKG +rsAdai21sMaCGBoftDgDSIJ2VJzf4MMlx/dgaJTIERiMoLm8dTVb4h1C+hUIuDnC +s6KbdzfiI7mYFA/pM05o90cuMTcCMikRbnWD4oSFOl2rfRioi/B6i/EYaZGjyqa8 +kTmnm2ghkaUyNWJ1MUTCnL/ujWq6BbpJh+ZO0DPuYANkvaQ3CkbcaLqGXy46dje4 +dKT00sDp0ABH/JlQdQGYaCFQJ8QR5JZuYHXyCLvKTiMFMLFiXKxs/sTgJ5MpK1Ey +/ZVmhM7nwzrO6EYZjLUU++4h+jcGB9UmOaVH+RNtehxrtkmnAUrhHdpvwS4lNX1w +ggVtUIS/IjVoy3behEnBIsxZS6N9cyCsznelDsbjQp3+tICEdPIY+j4BC5xBfDB3 +5xSzAOaSVatiNiopVscOqSuGCBmxG9GenYmrhX/QCLc06FIDAFM= +=blcV +-----END PGP SIGNATURE----- From e60136a3d7a223dd8e84ba8a6895bc3142360993 Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 29 Aug 2022 13:27:45 +1000 Subject: [PATCH 230/287] additional keys --- .git_allowed_signers | 3 +++ .git_allowed_signers.asc | 26 +++++++++++++------------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.git_allowed_signers b/.git_allowed_signers index cc9608836..0313c1ecd 100644 --- a/.git_allowed_signers +++ b/.git_allowed_signers @@ -1,2 +1,5 @@ dtucker@dtucker.net ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKecyjh9aNmD4rb8WblA8v91JjRb0Cd2JtkzqxcggGeG djm@mindrot.org sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBLnJo3ZVDENYZGXm5uO9lU7b0iDFq5gHpTu1MaHPWTEfPdvw+AjFQQ/q5YizuMJkXGsMdYmblJEJZYHpm9IS7ZkAAAAEc3NoOg== +djm@mindrot.org sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBJoAXBTQalfg+kC5wy1vE7HkIHtVnmV6AUuuIo9KQ1P+70juHwvsFKpsGaqQbrHJkTVgYDGVP02XHj8+Fb18yBIAAAAEc3NoOg== +djm@mindrot.org sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBH+z1I48s6ydOhP5SJmI02zVCLf0K15B+UMHgoTIKVfUIv5oDoVX7e9f+7QiRmTeEOdZfQydiaVqsfi7qPSve+0AAAAEc3NoOg== +djm@mindrot.org sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBPM4BmUg/fMnsl42JwktTekk/mB8Be3M+yK2ayg6lqYsqEri8yhRx84gey51OHKVk1TwlGbJjcMHI4URreDBEMQAAAAEc3NoOg== diff --git a/.git_allowed_signers.asc b/.git_allowed_signers.asc index 192752994..5fc6118ca 100644 --- a/.git_allowed_signers.asc +++ b/.git_allowed_signers.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmMMMQAACgkQKj9BTnNg -YLrlJBAAlih7AHfnLlo9SJ0zTV2TrjNbD71H4qM3/zZD8rg3rmRIf+J1/Nm9YwgO -tZERifvJ+FUoKX8upLAnektO66r50gO+7YMN5K+3Ap/NJ4V0QT94u8EQj3anqiKB -UraLxv6rJnI3Q4MG5rfyN34ypb9MRVe/8e1kqaL5NxMf+MMIaamQ0+xh2X7Ra+eX -WR3Jw7h+fTWr0BAbF5Mj/2BwMp4bHBEbxjM7D8cjpPsVGHHHuTpGzbAJXdLYkPKG -rsAdai21sMaCGBoftDgDSIJ2VJzf4MMlx/dgaJTIERiMoLm8dTVb4h1C+hUIuDnC -s6KbdzfiI7mYFA/pM05o90cuMTcCMikRbnWD4oSFOl2rfRioi/B6i/EYaZGjyqa8 -kTmnm2ghkaUyNWJ1MUTCnL/ujWq6BbpJh+ZO0DPuYANkvaQ3CkbcaLqGXy46dje4 -dKT00sDp0ABH/JlQdQGYaCFQJ8QR5JZuYHXyCLvKTiMFMLFiXKxs/sTgJ5MpK1Ey -/ZVmhM7nwzrO6EYZjLUU++4h+jcGB9UmOaVH+RNtehxrtkmnAUrhHdpvwS4lNX1w -ggVtUIS/IjVoy3behEnBIsxZS6N9cyCsznelDsbjQp3+tICEdPIY+j4BC5xBfDB3 -5xSzAOaSVatiNiopVscOqSuGCBmxG9GenYmrhX/QCLc06FIDAFM= -=blcV +iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmMMMiIACgkQKj9BTnNg +YLpyGhAAhZ1RxmD62JnT0gnor1aD0inq1fGPRadaFvXH2OScPcxXMIZWx+otnyZ/ +H9s0bIti42dPHqurgh92KS2mDGVIW8Y8MvxFUr678+hdem1U7Xvjoo0uaveNhJhe +GxuQDOvXKRmmfL2c6w3wnFChFA1o3K+JNshjCHhWz7u6+UmY0Q9yIxqbSi+vmEPP +NfWPfGdu4h8r7q11UgTxRSUQkfZXMqpBtb367B9BLduGuKRFKEJNyi6WpjBrqy38 +BvEbAaL52KX8hEp3TKMjo38RbOK+veSoPV5zlLui0WlEwwasgljal3f4RkqCAJob +hqpFJRogM5XNnA2e68TDTf3buJ3wRRjuK39/CusOJz5v4i6+VCdte+BET1Y4gD6y +v8KV4pRyumcdbN3khFUkmaQsjo+fyQjWNrgOvv60J2xUWZdchn8lxHOxrfRVKnOi +BD4bdks7tPQY/XsS5GNJIp21Ji9HGyBajjHo0BlesLodw7FEOf6YE18A3n9qzosR +RliuP4Hs/Z4sCUuDTbpKtQiUVs40kBbkhEL8kS8FsXz3VO89hAWaUqNUYom8AkKv +nfDjrZDBLXuVj1Mi8qNPXxqrB/1Cza2/W4U7SK4TlMFXfoXXWxxhefN5vIdMhAJB +u9Mdz1pY9mowKbd0c0dR+3fauvjM133dzKuyeDHMqDa5JPyd59o= +=kgnS -----END PGP SIGNATURE----- From fcf5365da69c516817321ba89c3a91df98d098df Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 31 Aug 2022 02:56:40 +0000 Subject: [PATCH 231/287] upstream: whitespace OpenBSD-Commit-ID: c2bcbf93610d3d62ed206cdf9bf9ff98c6aaf232 --- packet.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packet.c b/packet.c index bde6c1045..3f64d2d32 100644 --- a/packet.c +++ b/packet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.307 2022/01/22 00:49:34 djm Exp $ */ +/* $OpenBSD: packet.c,v 1.308 2022/08/31 02:56:40 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -986,7 +986,7 @@ ssh_packet_need_rekeying(struct ssh *ssh, u_int outbound_packet_len) return 1; /* - * Always rekey when MAX_PACKETS sent in either direction + * Always rekey when MAX_PACKETS sent in either direction * As per RFC4344 section 3.1 we do this after 2^31 packets. */ if (state->p_send.packets > MAX_PACKETS || From 03277a4aa49b80af541a3e691f264c0c0d8f9cec Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Wed, 31 Aug 2022 20:26:30 +1000 Subject: [PATCH 232/287] Move sftp from valgrind-2 to 3 to rebalance. --- .github/configs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/configs b/.github/configs index c068f5d8d..6bf1ab27f 100755 --- a/.github/configs +++ b/.github/configs @@ -162,8 +162,8 @@ case "$config" in # Valgrind slows things down enough that the agent timeout test # won't reliably pass, and the unit tests run longer than allowed # by github so split into three separate tests. - tests2="rekey integrity try-ciphers sftp" - tests3="krl forward-control sshsig agent-restrict kextype" + tests2="rekey integrity try-ciphers" + tests3="krl forward-control sshsig agent-restrict kextype sftp" tests4="cert-userkey cert-hostkey kextype sftp-perm keygen-comment percent" case "$config" in valgrind-1) From 5f45c2395c60865e59fa44152ff1d003a128c5bc Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 2 Sep 2022 04:20:02 +0000 Subject: [PATCH 233/287] upstream: sk-usbhid: fix key_lookup() on tokens with built-in UV explicitly test whether the token performs built-in UV (e.g. biometric tokens) and enable UV in that case. From Pedro Martelletto via GHPR#388 OpenBSD-Commit-ID: 007eb7e387d27cf3029ab06b88224e03eca62ccd --- sk-usbhid.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 7bc11ccf4..3ba2cf268 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.43 2022/08/19 05:53:28 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.44 2022/09/02 04:20:02 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -783,6 +783,7 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, fido_assert_t *assert = NULL; uint8_t message[32]; int r = FIDO_ERR_INTERNAL; + int sk_supports_uv, uv; size_t i; memset(message, '\0', sizeof(message)); @@ -802,7 +803,15 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, goto out; } if ((r = fido_assert_set_up(assert, FIDO_OPT_FALSE)) != FIDO_OK) { - skdebug(__func__, "fido_assert_up: %s", fido_strerr(r)); + skdebug(__func__, "fido_assert_set_up: %s", fido_strerr(r)); + goto out; + } + uv = FIDO_OPT_OMIT; + if (pin == NULL && check_sk_options(dev, "uv", &sk_supports_uv) == 0 && + sk_supports_uv != -1) + uv = FIDO_OPT_TRUE; + if ((r = fido_assert_set_uv(assert, uv)) != FIDO_OK) { + skdebug(__func__, "fido_assert_set_uv: %s", fido_strerr(r)); goto out; } if ((r = fido_dev_get_assert(dev, assert, pin)) != FIDO_OK) { From c83e467ead67a8cb48ef4bec8085d6fb880a2ff4 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 2 Sep 2022 14:17:28 +1000 Subject: [PATCH 234/287] Remove arc4random_uniform from arc4random.c This was previously moved into its own file (matching OpenBSD) which prematurely committed in commit 73541f2. --- openbsd-compat/arc4random.c | 38 ------------------------------------- 1 file changed, 38 deletions(-) diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index 2f91c2b2b..2751fb839 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -242,44 +242,6 @@ arc4random_buf(void *_buf, size_t n) } #endif /* !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) */ -#ifndef HAVE_ARC4RANDOM_UNIFORM -/* - * Calculate a uniformly distributed random number less than upper_bound - * avoiding "modulo bias". - * - * Uniformity is achieved by generating new random numbers until the one - * returned is outside the range [0, 2**32 % upper_bound). This - * guarantees the selected random number will be inside - * [2**32 % upper_bound, 2**32) which maps back to [0, upper_bound) - * after reduction modulo upper_bound. - */ -u_int32_t -arc4random_uniform(u_int32_t upper_bound) -{ - u_int32_t r, min; - - if (upper_bound < 2) - return 0; - - /* 2**32 % x == (2**32 - x) % x */ - min = -upper_bound % upper_bound; - - /* - * This could theoretically loop forever but each retry has - * p > 0.5 (worst case, usually far better) of selecting a - * number inside the range we need, so it should rarely need - * to re-roll. - */ - for (;;) { - r = arc4random(); - if (r >= min) - break; - } - - return r % upper_bound; -} -#endif /* !HAVE_ARC4RANDOM_UNIFORM */ - #if 0 /*-------- Test code for i386 --------*/ #include From beaddde26f30e2195b8aa4f3193970e140e17305 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 2 Sep 2022 14:20:04 +1000 Subject: [PATCH 235/287] Move OPENBSD ORIGINAL marker. Putting this after the copyright statement (which doesn't change) instead of before the version identifier (which does) prevents merge conflicts when resyncing changes. --- openbsd-compat/arc4random_uniform.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openbsd-compat/arc4random_uniform.c b/openbsd-compat/arc4random_uniform.c index b1a8aeea2..591f92d15 100644 --- a/openbsd-compat/arc4random_uniform.c +++ b/openbsd-compat/arc4random_uniform.c @@ -1,5 +1,3 @@ -/* OPENBSD ORIGINAL: lib/libc/crypt/arc4random_uniform.c */ - /* $OpenBSD: arc4random_uniform.c,v 1.3 2019/01/20 02:59:07 bcook Exp $ */ /* @@ -18,6 +16,8 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +/* OPENBSD ORIGINAL: lib/libc/crypto/arc4random_uniform.c */ + #include "includes.h" #ifdef HAVE_STDINT_H From ce39e7d8b70c4726defde5d3bc4cb7d40d131153 Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 2 Sep 2022 14:28:14 +1000 Subject: [PATCH 236/287] Resync arc4random with OpenBSD. This brings us up to current, including djm's random-reseeding change, as prompted by logan at cyberstorm.mu in bz#3467. It brings the platform-specific hooks from LibreSSL Portable, simplified to match our use case. ok djm@. --- openbsd-compat/arc4random.c | 193 +++++++++++++++----------------- openbsd-compat/arc4random.h | 79 +++++++++++++ openbsd-compat/openbsd-compat.h | 13 +-- 3 files changed, 176 insertions(+), 109 deletions(-) create mode 100644 openbsd-compat/arc4random.h diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index 2751fb839..ae48cce9e 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -1,11 +1,10 @@ -/* OPENBSD ORIGINAL: lib/libc/crypto/arc4random.c */ - -/* $OpenBSD: arc4random.c,v 1.25 2013/10/01 18:34:57 markus Exp $ */ +/* $OpenBSD: arc4random.c,v 1.58 2022/07/31 13:41:45 tb Exp $ */ /* * Copyright (c) 1996, David Mazieres * Copyright (c) 2008, Damien Miller * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -24,14 +23,23 @@ * ChaCha based random number generator for OpenBSD. */ +/* OPENBSD ORIGINAL: lib/libc/crypt/arc4random.c */ + #include "includes.h" #include #include +#include +#include +#ifdef HAVE_STDINT_H +#include +#endif #include #include #include +#include +#include #ifndef HAVE_ARC4RANDOM @@ -44,33 +52,43 @@ # define getentropy(x, y) (_ssh_compat_getentropy((x), (y))) #endif -#define MINIMUM(a, b) (((a) < (b)) ? (a) : (b)) +#define DEF_WEAK(x) #include "log.h" #define KEYSTREAM_ONLY #include "chacha_private.h" -#ifdef __GNUC__ -#define inline __inline -#else /* !__GNUC__ */ -#define inline -#endif /* !__GNUC__ */ +#define minimum(a, b) ((a) < (b) ? (a) : (b)) -/* OpenSSH isn't multithreaded */ -#define _ARC4_LOCK() -#define _ARC4_UNLOCK() +#if defined(__GNUC__) || defined(_MSC_VER) +#define inline __inline +#else /* __GNUC__ || _MSC_VER */ +#define inline +#endif /* !__GNUC__ && !_MSC_VER */ #define KEYSZ 32 #define IVSZ 8 #define BLOCKSZ 64 #define RSBUFSZ (16*BLOCKSZ) -static int rs_initialized; -static pid_t rs_stir_pid; -static chacha_ctx rs; /* chacha context for random keystream */ -static u_char rs_buf[RSBUFSZ]; /* keystream blocks */ -static size_t rs_have; /* valid bytes at end of rs_buf */ -static size_t rs_count; /* bytes till reseed */ + +#define REKEY_BASE (1024*1024) /* NB. should be a power of 2 */ + +/* Marked MAP_INHERIT_ZERO, so zero'd out in fork children. */ +static struct _rs { + size_t rs_have; /* valid bytes at end of rs_buf */ + size_t rs_count; /* bytes till reseed */ +} *rs; + +/* Maybe be preserved in fork children, if _rs_allocate() decides. */ +static struct _rsx { + chacha_ctx rs_chacha; /* chacha context for random keystream */ + u_char rs_buf[RSBUFSZ]; /* keystream blocks */ +} *rsx; + +static inline int _rs_allocate(struct _rs **, struct _rsx **); +static inline void _rs_forkdetect(void); +#include "arc4random.h" static inline void _rs_rekey(u_char *dat, size_t datlen); @@ -79,137 +97,128 @@ _rs_init(u_char *buf, size_t n) { if (n < KEYSZ + IVSZ) return; - chacha_keysetup(&rs, buf, KEYSZ * 8); - chacha_ivsetup(&rs, buf + KEYSZ); + + if (rs == NULL) { + if (_rs_allocate(&rs, &rsx) == -1) + _exit(1); + } + + chacha_keysetup(&rsx->rs_chacha, buf, KEYSZ * 8); + chacha_ivsetup(&rsx->rs_chacha, buf + KEYSZ); } static void _rs_stir(void) { u_char rnd[KEYSZ + IVSZ]; + uint32_t rekey_fuzz = 0; if (getentropy(rnd, sizeof rnd) == -1) - fatal("getentropy failed"); + _getentropy_fail(); - if (!rs_initialized) { - rs_initialized = 1; + if (!rs) _rs_init(rnd, sizeof(rnd)); - } else + else _rs_rekey(rnd, sizeof(rnd)); - explicit_bzero(rnd, sizeof(rnd)); + explicit_bzero(rnd, sizeof(rnd)); /* discard source seed */ /* invalidate rs_buf */ - rs_have = 0; - memset(rs_buf, 0, RSBUFSZ); + rs->rs_have = 0; + memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf)); - rs_count = 1600000; + /* rekey interval should not be predictable */ + chacha_encrypt_bytes(&rsx->rs_chacha, (uint8_t *)&rekey_fuzz, + (uint8_t *)&rekey_fuzz, sizeof(rekey_fuzz)); + rs->rs_count = REKEY_BASE + (rekey_fuzz % REKEY_BASE); } static inline void _rs_stir_if_needed(size_t len) { - pid_t pid = getpid(); - - if (rs_count <= len || !rs_initialized || rs_stir_pid != pid) { - rs_stir_pid = pid; + _rs_forkdetect(); + if (!rs || rs->rs_count <= len) _rs_stir(); - } else - rs_count -= len; + if (rs->rs_count <= len) + rs->rs_count = 0; + else + rs->rs_count -= len; } static inline void _rs_rekey(u_char *dat, size_t datlen) { #ifndef KEYSTREAM_ONLY - memset(rs_buf, 0,RSBUFSZ); + memset(rsx->rs_buf, 0, sizeof(rsx->rs_buf)); #endif /* fill rs_buf with the keystream */ - chacha_encrypt_bytes(&rs, rs_buf, rs_buf, RSBUFSZ); + chacha_encrypt_bytes(&rsx->rs_chacha, rsx->rs_buf, + rsx->rs_buf, sizeof(rsx->rs_buf)); /* mix in optional user provided data */ if (dat) { size_t i, m; - m = MINIMUM(datlen, KEYSZ + IVSZ); + m = minimum(datlen, KEYSZ + IVSZ); for (i = 0; i < m; i++) - rs_buf[i] ^= dat[i]; + rsx->rs_buf[i] ^= dat[i]; } /* immediately reinit for backtracking resistance */ - _rs_init(rs_buf, KEYSZ + IVSZ); - memset(rs_buf, 0, KEYSZ + IVSZ); - rs_have = RSBUFSZ - KEYSZ - IVSZ; + _rs_init(rsx->rs_buf, KEYSZ + IVSZ); + memset(rsx->rs_buf, 0, KEYSZ + IVSZ); + rs->rs_have = sizeof(rsx->rs_buf) - KEYSZ - IVSZ; } static inline void _rs_random_buf(void *_buf, size_t n) { u_char *buf = (u_char *)_buf; + u_char *keystream; size_t m; _rs_stir_if_needed(n); while (n > 0) { - if (rs_have > 0) { - m = MINIMUM(n, rs_have); - memcpy(buf, rs_buf + RSBUFSZ - rs_have, m); - memset(rs_buf + RSBUFSZ - rs_have, 0, m); + if (rs->rs_have > 0) { + m = minimum(n, rs->rs_have); + keystream = rsx->rs_buf + sizeof(rsx->rs_buf) + - rs->rs_have; + memcpy(buf, keystream, m); + memset(keystream, 0, m); buf += m; n -= m; - rs_have -= m; + rs->rs_have -= m; } - if (rs_have == 0) + if (rs->rs_have == 0) _rs_rekey(NULL, 0); } } static inline void -_rs_random_u32(u_int32_t *val) +_rs_random_u32(uint32_t *val) { + u_char *keystream; + _rs_stir_if_needed(sizeof(*val)); - if (rs_have < sizeof(*val)) + if (rs->rs_have < sizeof(*val)) _rs_rekey(NULL, 0); - memcpy(val, rs_buf + RSBUFSZ - rs_have, sizeof(*val)); - memset(rs_buf + RSBUFSZ - rs_have, 0, sizeof(*val)); - rs_have -= sizeof(*val); - return; + keystream = rsx->rs_buf + sizeof(rsx->rs_buf) - rs->rs_have; + memcpy(val, keystream, sizeof(*val)); + memset(keystream, 0, sizeof(*val)); + rs->rs_have -= sizeof(*val); } -void -arc4random_stir(void) -{ - _ARC4_LOCK(); - _rs_stir(); - _ARC4_UNLOCK(); -} - -void -arc4random_addrandom(u_char *dat, int datlen) -{ - int m; - - _ARC4_LOCK(); - if (!rs_initialized) - _rs_stir(); - while (datlen > 0) { - m = MINIMUM(datlen, KEYSZ + IVSZ); - _rs_rekey(dat, m); - dat += m; - datlen -= m; - } - _ARC4_UNLOCK(); -} - -u_int32_t +uint32_t arc4random(void) { - u_int32_t val; + uint32_t val; _ARC4_LOCK(); _rs_random_u32(&val); _ARC4_UNLOCK(); return val; } +DEF_WEAK(arc4random); /* - * If we are providing arc4random, then we can provide a more efficient + * If we are providing arc4random, then we can provide a more efficient * arc4random_buf(). */ # ifndef HAVE_ARC4RANDOM_BUF @@ -220,6 +229,7 @@ arc4random_buf(void *buf, size_t n) _rs_random_buf(buf, n); _ARC4_UNLOCK(); } +DEF_WEAK(arc4random_buf); # endif /* !HAVE_ARC4RANDOM_BUF */ #endif /* !HAVE_ARC4RANDOM */ @@ -242,24 +252,3 @@ arc4random_buf(void *_buf, size_t n) } #endif /* !defined(HAVE_ARC4RANDOM_BUF) && defined(HAVE_ARC4RANDOM) */ -#if 0 -/*-------- Test code for i386 --------*/ -#include -#include -int -main(int argc, char **argv) -{ - const int iter = 1000000; - int i; - pctrval v; - - v = rdtsc(); - for (i = 0; i < iter; i++) - arc4random(); - v = rdtsc() - v; - v /= iter; - - printf("%qd cycles\n", v); - exit(0); -} -#endif diff --git a/openbsd-compat/arc4random.h b/openbsd-compat/arc4random.h new file mode 100644 index 000000000..2b57611f0 --- /dev/null +++ b/openbsd-compat/arc4random.h @@ -0,0 +1,79 @@ +/* $OpenBSD: arc4random_linux.h,v 1.12 2019/07/11 10:37:28 inoguchi Exp $ */ + +/* + * Copyright (c) 1996, David Mazieres + * Copyright (c) 2008, Damien Miller + * Copyright (c) 2013, Markus Friedl + * Copyright (c) 2014, Theo de Raadt + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * Stub functions for portability. From LibreSSL with some adaptations. + */ + +#include + +#include + +/* OpenSSH isn't multithreaded */ +#define _ARC4_LOCK() +#define _ARC4_UNLOCK() +#define _ARC4_ATFORK(f) + +static inline void +_getentropy_fail(void) +{ + fatal("getentropy failed"); +} + +static volatile sig_atomic_t _rs_forked; + +static inline void +_rs_forkhandler(void) +{ + _rs_forked = 1; +} + +static inline void +_rs_forkdetect(void) +{ + static pid_t _rs_pid = 0; + pid_t pid = getpid(); + + if (_rs_pid == 0 || _rs_pid == 1 || _rs_pid != pid || _rs_forked) { + _rs_pid = pid; + _rs_forked = 0; + if (rs) + memset(rs, 0, sizeof(*rs)); + } +} + +static inline int +_rs_allocate(struct _rs **rsp, struct _rsx **rsxp) +{ + if ((*rsp = mmap(NULL, sizeof(**rsp), PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) + return (-1); + + if ((*rsxp = mmap(NULL, sizeof(**rsxp), PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE, -1, 0)) == MAP_FAILED) { + munmap(*rsp, sizeof(**rsp)); + *rsp = NULL; + return (-1); + } + + _ARC4_ATFORK(_rs_forkhandler); + return (0); +} diff --git a/openbsd-compat/openbsd-compat.h b/openbsd-compat/openbsd-compat.h index bbf89825b..4af207cdd 100644 --- a/openbsd-compat/openbsd-compat.h +++ b/openbsd-compat/openbsd-compat.h @@ -218,19 +218,18 @@ int writev(int, struct iovec *, int); int getpeereid(int , uid_t *, gid_t *); #endif -#ifdef HAVE_ARC4RANDOM -# ifndef HAVE_ARC4RANDOM_STIR -# define arc4random_stir() -# endif -#else -unsigned int arc4random(void); -void arc4random_stir(void); +#ifndef HAVE_ARC4RANDOM +uint32_t arc4random(void); #endif /* !HAVE_ARC4RANDOM */ #ifndef HAVE_ARC4RANDOM_BUF void arc4random_buf(void *, size_t); #endif +#ifndef HAVE_ARC4RANDOM_STIR +# define arc4random_stir() +#endif + #ifndef HAVE_ARC4RANDOM_UNIFORM uint32_t arc4random_uniform(uint32_t); #endif From 6cb6f660bb35f77a0456dd2581ddf39c29398a5e Mon Sep 17 00:00:00 2001 From: Darren Tucker Date: Fri, 2 Sep 2022 16:43:27 +1000 Subject: [PATCH 237/287] Remove DEF_WEAK, it's already in defines.h. --- openbsd-compat/arc4random.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/openbsd-compat/arc4random.c b/openbsd-compat/arc4random.c index ae48cce9e..02f15f9c3 100644 --- a/openbsd-compat/arc4random.c +++ b/openbsd-compat/arc4random.c @@ -52,8 +52,6 @@ # define getentropy(x, y) (_ssh_compat_getentropy((x), (y))) #endif -#define DEF_WEAK(x) - #include "log.h" #define KEYSTREAM_ONLY From be197635329feb839865fdc738e34e24afd1fca8 Mon Sep 17 00:00:00 2001 From: Sam James Date: Thu, 8 Sep 2022 02:49:29 +0100 Subject: [PATCH 238/287] openbsd-compat/bsd-asprintf: add include for vsnprintf Fixes the following build failure with Clang 15 on musl: ``` bsd-asprintf.c:51:8: error: call to undeclared library function 'vsnprintf' with type 'int (char *, unsigned long, const char *, struct __va_list_tag *)'; ISO C99 and laterclang -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wmisleading-indentation -Wbitwise-instead-of-logical -fno-strict-aliasing -mretpoline -ftrapv -fzero-call-used-regs=all -fno-builtin-memset -fstack-protector-strong -fPIE -I. -I. -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -DSSHDIR=\"/etc/ssh\" -D_PATH_SSH_PROGRAM=\"/usr/bin/ssh\" -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/lib/misc/ssh-askpass\" -D_PATH_SFTP_SERVER=\"/usr/lib/misc/sftp-server\" -D_PATH_SSH_KEY_SIGN=\"/usr/lib/misc/ssh-keysign\" -D_PATH_SSH_PKCS11_HELPER=\"/usr/lib/misc/ssh-pkcs11-helper\" -D_PATH_SSH_SK_HELPER=\"/usr/lib/misc/ssh-sk-helper\" -D_PATH_SSH_PIDDIR=\"/run\" -D_PATH_PRIVSEP_CHROOT_DIR=\"/var/empty\" -DHAVE_CONFIG_H -c cipher-aes.c -o cipher-aes.o do not support implicit function declarations [-Wimplicit-function-declaration] ret = vsnprintf(string, INIT_SZ, fmt, ap2); ^ bsd-asprintf.c:51:8: note: include the header or explicitly provide a declaration for 'vsnprintf' 1 error generated. ``` --- openbsd-compat/bsd-asprintf.c | 1 + 1 file changed, 1 insertion(+) diff --git a/openbsd-compat/bsd-asprintf.c b/openbsd-compat/bsd-asprintf.c index 109277271..511c817bb 100644 --- a/openbsd-compat/bsd-asprintf.c +++ b/openbsd-compat/bsd-asprintf.c @@ -32,6 +32,7 @@ #include #include +#include #include #define INIT_SZ 128 From 0ba39b93b326a7d5dfab776cc9b9d326161a9b16 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 9 Sep 2022 03:31:42 +0000 Subject: [PATCH 239/287] upstream: notifier_complete(NULL, ...) is a noop, so no need to test that ctx!=NULL; from Corinna Vinschen OpenBSD-Commit-ID: ade2f2e9cc519d01a586800c25621d910bce384a --- ssh-agent.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index 27d0548f2..e8fb7a4f2 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.288 2022/04/29 03:13:32 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.289 2022/09/09 03:31:42 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -837,10 +837,8 @@ process_sign_request2(SocketEntry *e) debug_fr(r, "sshkey_sign"); if (pin == NULL && !retried && sshkey_is_sk(id->key) && r == SSH_ERR_KEY_WRONG_PASSPHRASE) { - if (notifier) { - notify_complete(notifier, NULL); - notifier = NULL; - } + notify_complete(notifier, NULL); + notifier = NULL; /* XXX include sig_dest */ xasprintf(&prompt, "Enter PIN%sfor %s key %s: ", (id->key->sk_flags & SSH_SK_USER_PRESENCE_REQD) ? From f4d2ff04099e7daa73f0a6b09a312387051303e2 Mon Sep 17 00:00:00 2001 From: Tess Gauthier Date: Tue, 13 Sep 2022 17:50:40 -0400 Subject: [PATCH 240/287] fix pester test failures --- contrib/win32/win32compat/win32_dirent.c | 19 ++++++++++++++++--- sftp-client.c | 10 +++++----- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/contrib/win32/win32compat/win32_dirent.c b/contrib/win32/win32compat/win32_dirent.c index 87202ef66..547a57d29 100644 --- a/contrib/win32/win32compat/win32_dirent.c +++ b/contrib/win32/win32compat/win32_dirent.c @@ -268,14 +268,27 @@ readdir(void *avp) char * basename(char *path) { - char *pdest; + char *pdest; + const char *endp; + static char bname[PATH_MAX]; + + /* Find any trailing slashes */ + endp = path + strlen(path) - 1; + while (endp > path && (*endp == '/' || *endp == '\\')) + endp--; + + int path_len = endp - path + 1; + if (strncpy_s(bname, PATH_MAX, path, path_len + 1)) { + return NULL; + } + bname[path_len] = '\0'; if (!path) return "."; - pdest = strrchr(path, '/'); + pdest = strrchr(bname, '/'); if (pdest) return (pdest + 1); - pdest = strrchr(path, '\\'); + pdest = strrchr(bname, '\\'); if (pdest) return (pdest + 1); diff --git a/sftp-client.c b/sftp-client.c index d4671883c..f786dd67d 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1819,6 +1819,11 @@ do_download(struct sftp_conn *conn, const char *remote_path, status = SSH2_FX_FAILURE; else status = SSH2_FX_OK; +#ifdef WINDOWS + if (add_mark_of_web(local_path) == -1) { + debug("%s: failed to add mark of the web", local_path); + } +#endif // WINDOWS /* Override umask and utimes if asked */ #ifdef HAVE_FCHMOD if (preserve_flag && fchmod(local_fd, mode) == -1) @@ -1847,11 +1852,6 @@ do_download(struct sftp_conn *conn, const char *remote_path, } } close(local_fd); -#ifdef WINDOWS - if (add_mark_of_web(local_path) == -1) { - debug("%s: failed to add mark of the web", local_path); - } -#endif // WINDOWS sshbuf_free(msg); free(handle); From 86af013b56cecb5ee58ae0bd9d495cd586fc5918 Mon Sep 17 00:00:00 2001 From: "jsg@openbsd.org" Date: Sat, 10 Sep 2022 08:50:53 +0000 Subject: [PATCH 241/287] upstream: fix repeated words ok miod@ jmc@ OpenBSD-Commit-ID: 6765daefe26a6b648cc15cadbbe337596af709b7 --- ssh-keygen.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ssh-keygen.1 b/ssh-keygen.1 index b31661c10..8b1f617d2 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.225 2022/08/16 20:24:08 jmc Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.226 2022/09/10 08:50:53 jsg Exp $ .\" .\" Author: Tatu Ylonen .\" Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: August 16 2022 $ +.Dd $Mdocdate: September 10 2022 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -1059,7 +1059,7 @@ or Refer to those manual pages for details. .Sh FIDO AUTHENTICATOR .Nm -is able to to generate FIDO authenticator-backed keys, after which +is able to generate FIDO authenticator-backed keys, after which they may be used much like any other key type supported by OpenSSH, so long as the hardware authenticator is attached when the keys are used. FIDO authenticators generally require the user to explicitly authorise From 113523bf0bc33600b07ebb083572c8c346b6fdf4 Mon Sep 17 00:00:00 2001 From: "jmc@openbsd.org" Date: Sun, 11 Sep 2022 06:38:11 +0000 Subject: [PATCH 242/287] upstream: .Li -> .Vt where appropriate; from josiah frentsos, tweaked by schwarze ok schwarze OpenBSD-Commit-ID: 565046e3ce68b46c2f440a93d67c2a92726de8ed --- sshd.8 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sshd.8 b/sshd.8 index 8ccc5bc01..ac1c62de0 100644 --- a/sshd.8 +++ b/sshd.8 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd.8,v 1.320 2022/08/11 01:56:51 djm Exp $ -.Dd $Mdocdate: August 11 2022 $ +.\" $OpenBSD: sshd.8,v 1.321 2022/09/11 06:38:11 jmc Exp $ +.Dd $Mdocdate: September 11 2022 $ .Dt SSHD 8 .Os .Sh NAME @@ -217,7 +217,7 @@ reliably as configuration options may change. .It Fl u Ar len This option is used to specify the size of the field in the -.Li utmp +.Vt utmp structure that holds the remote host name. If the resolved host name is longer than .Ar len , From 4b5f91cb959358141181b934156513fcb8a6c1e3 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 14 Sep 2022 00:02:03 +0000 Subject: [PATCH 243/287] upstream: ssh-agent: attempt FIDO key signing without PIN and use the error to determine whether a PIN is required and prompt only if necessary. from Corinna Vinschen OpenBSD-Commit-ID: dd6be6a0b7148608e834ee737c3479b3270b00dd --- ssh-agent.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index e8fb7a4f2..ddda4d77b 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.289 2022/09/09 03:31:42 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.290 2022/09/14 00:02:03 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -813,16 +813,7 @@ process_sign_request2(SocketEntry *e) /* error already logged */ goto send; } - if ((id->key->sk_flags & SSH_SK_USER_VERIFICATION_REQD)) { - /* XXX include sig_dest */ - xasprintf(&prompt, "Enter PIN%sfor %s key %s: ", - (id->key->sk_flags & SSH_SK_USER_PRESENCE_REQD) ? - " and confirm user presence " : " ", - sshkey_type(id->key), fp); - pin = read_passphrase(prompt, RP_USE_ASKPASS); - free(prompt); - prompt = NULL; - } else if ((id->key->sk_flags & SSH_SK_USER_PRESENCE_REQD)) { + if (id->key->sk_flags & SSH_SK_USER_PRESENCE_REQD) { notifier = notify_start(0, "Confirm user presence for key %s %s%s%s", sshkey_type(id->key), fp, From 940dc10729cb5a95b7ee82c10184e2b9621c8a1d Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 14 Sep 2022 00:13:13 +0000 Subject: [PATCH 244/287] upstream: a little extra debugging OpenBSD-Commit-ID: edf1601c1d0905f6da4c713f4d9cecc7d1c0295a --- ssh-agent.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ssh-agent.c b/ssh-agent.c index ddda4d77b..0aef07eb5 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.290 2022/09/14 00:02:03 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.291 2022/09/14 00:13:13 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -845,6 +845,7 @@ process_sign_request2(SocketEntry *e) /* Success */ ok = 0; send: + debug_f("good signature"); notify_complete(notifier, "User presence confirmed"); if (ok == 0) { From ff9809fdfd1d9a91067bb14a77d176002edb153c Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Wed, 14 Sep 2022 00:14:37 +0000 Subject: [PATCH 245/287] upstream: sk_enroll: never drop SSH_SK_USER_VERIFICATION_REQD flag from response Now that all FIDO signing calls attempt first without PIN and then fall back to trying PIN only if that attempt fails, we can remove the hack^wtrick that removed the UV flag from the keys returned during enroll. By Corinna Vinschen OpenBSD-Commit-ID: 684517608c8491503bf80cd175425f0178d91d7f --- sk-usbhid.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index 3ba2cf268..46e09c26c 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sk-usbhid.c,v 1.44 2022/09/02 04:20:02 djm Exp $ */ +/* $OpenBSD: sk-usbhid.c,v 1.45 2022/09/14 00:14:37 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl * Copyright (c) 2020 Pedro Martelletto @@ -847,7 +847,6 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, struct sk_enroll_response *response = NULL; size_t len; int credprot; - int internal_uv; int cose_alg; int ret = SSH_SK_ERR_GENERAL; int r; @@ -980,13 +979,6 @@ sk_enroll(uint32_t alg, const uint8_t *challenge, size_t challenge_len, goto out; } response->flags = flags; - if ((flags & SSH_SK_USER_VERIFICATION_REQD)) { - if (check_sk_options(sk->dev, "uv", &internal_uv) == 0 && - internal_uv != -1) { - /* user verification handled by token */ - response->flags &= ~SSH_SK_USER_VERIFICATION_REQD; - } - } if (pack_public_key(alg, cred, response) != 0) { skdebug(__func__, "pack_public_key failed"); goto out; From b006c8d8f4b886586b9a10c12a46f93c804d76c8 Mon Sep 17 00:00:00 2001 From: Tess Gauthier Date: Wed, 14 Sep 2022 17:30:12 -0400 Subject: [PATCH 246/287] define HAVE_KILLPG --- contrib/win32/openssh/config.h.vs | 1 + 1 file changed, 1 insertion(+) diff --git a/contrib/win32/openssh/config.h.vs b/contrib/win32/openssh/config.h.vs index 560381ea3..976d7f107 100644 --- a/contrib/win32/openssh/config.h.vs +++ b/contrib/win32/openssh/config.h.vs @@ -1733,3 +1733,4 @@ #define WITH_ZLIB #define _PATH_TTY "conin$" #define HAVE_STRUCT_POLLFD_FD 1 +#define HAVE_KILLPG 1 From 590db83384f9d99fc51c84505792d26d1ef60df9 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 16 Sep 2022 03:13:34 +0000 Subject: [PATCH 247/287] upstream: sftp: Don't attempt to complete arguments for non-existent commands If user entered a non-existent command (e.g. because they made a typo) there is no point in trying to complete its arguments. Skip calling complete_match() if that's the case. From Michal Privoznik OpenBSD-Commit-ID: cf39c811a68cde2aeb98fc85addea4000ef6b07a --- sftp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sftp.c b/sftp.c index 939b8dc00..11ebe209c 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.218 2022/06/28 06:09:14 jmc Exp $ */ +/* $OpenBSD: sftp.c,v 1.219 2022/09/16 03:13:34 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -2143,7 +2143,7 @@ complete(EditLine *el, int ch) if (carg > 1 && line[cursor-1] != ' ') filematch = argv[carg - 1]; - if (remote != 0 && + if ((remote == REMOTE || remote == LOCAL) && complete_match(el, complete_ctx->conn, *complete_ctx->remote_pathp, filematch, remote, carg == argc, quote, terminated) != 0) From ac1ec9545947d9f9657259f55d04cb49d3a94c8a Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 16 Sep 2022 03:33:14 +0000 Subject: [PATCH 248/287] upstream: sftp: Be a bit more clever about completions There are commands (e.g. "get" or "put") that accept two arguments, a local path and a remote path. However, the way current completion is written doesn't take this distinction into account and always completes remote or local paths. By expanding CMD struct and "cmds" array this distinction can be reflected and with small adjustment to completer code the correct path can be completed. By Michal Privoznik, ok dtucker@ OpenBSD-Commit-ID: 1396d921c4eb1befd531f5c4a8ab47e7a74b610b --- sftp.c | 115 ++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 69 insertions(+), 46 deletions(-) diff --git a/sftp.c b/sftp.c index 11ebe209c..24568aade 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.219 2022/09/16 03:13:34 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.220 2022/09/16 03:33:14 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -166,7 +166,8 @@ enum sftp_command { struct CMD { const char *c; const int n; - const int t; + const int t; /* Completion type for the first argument */ + const int t2; /* completion type for the optional second argument */ }; /* Type of completion */ @@ -175,44 +176,44 @@ struct CMD { #define LOCAL 2 static const struct CMD cmds[] = { - { "bye", I_QUIT, NOARGS }, - { "cd", I_CHDIR, REMOTE }, - { "chdir", I_CHDIR, REMOTE }, - { "chgrp", I_CHGRP, REMOTE }, - { "chmod", I_CHMOD, REMOTE }, - { "chown", I_CHOWN, REMOTE }, - { "copy", I_COPY, REMOTE }, - { "cp", I_COPY, REMOTE }, - { "df", I_DF, REMOTE }, - { "dir", I_LS, REMOTE }, - { "exit", I_QUIT, NOARGS }, - { "get", I_GET, REMOTE }, - { "help", I_HELP, NOARGS }, - { "lcd", I_LCHDIR, LOCAL }, - { "lchdir", I_LCHDIR, LOCAL }, - { "lls", I_LLS, LOCAL }, - { "lmkdir", I_LMKDIR, LOCAL }, - { "ln", I_LINK, REMOTE }, - { "lpwd", I_LPWD, LOCAL }, - { "ls", I_LS, REMOTE }, - { "lumask", I_LUMASK, NOARGS }, - { "mkdir", I_MKDIR, REMOTE }, - { "mget", I_GET, REMOTE }, - { "mput", I_PUT, LOCAL }, - { "progress", I_PROGRESS, NOARGS }, - { "put", I_PUT, LOCAL }, - { "pwd", I_PWD, REMOTE }, - { "quit", I_QUIT, NOARGS }, - { "reget", I_REGET, REMOTE }, - { "rename", I_RENAME, REMOTE }, - { "reput", I_REPUT, LOCAL }, - { "rm", I_RM, REMOTE }, - { "rmdir", I_RMDIR, REMOTE }, - { "symlink", I_SYMLINK, REMOTE }, - { "version", I_VERSION, NOARGS }, - { "!", I_SHELL, NOARGS }, - { "?", I_HELP, NOARGS }, - { NULL, -1, -1 } + { "bye", I_QUIT, NOARGS, NOARGS }, + { "cd", I_CHDIR, REMOTE, NOARGS }, + { "chdir", I_CHDIR, REMOTE, NOARGS }, + { "chgrp", I_CHGRP, REMOTE, NOARGS }, + { "chmod", I_CHMOD, REMOTE, NOARGS }, + { "chown", I_CHOWN, REMOTE, NOARGS }, + { "copy", I_COPY, REMOTE, LOCAL }, + { "cp", I_COPY, REMOTE, LOCAL }, + { "df", I_DF, REMOTE, NOARGS }, + { "dir", I_LS, REMOTE, NOARGS }, + { "exit", I_QUIT, NOARGS, NOARGS }, + { "get", I_GET, REMOTE, LOCAL }, + { "help", I_HELP, NOARGS, NOARGS }, + { "lcd", I_LCHDIR, LOCAL, NOARGS }, + { "lchdir", I_LCHDIR, LOCAL, NOARGS }, + { "lls", I_LLS, LOCAL, NOARGS }, + { "lmkdir", I_LMKDIR, LOCAL, NOARGS }, + { "ln", I_LINK, REMOTE, REMOTE }, + { "lpwd", I_LPWD, LOCAL, NOARGS }, + { "ls", I_LS, REMOTE, NOARGS }, + { "lumask", I_LUMASK, NOARGS, NOARGS }, + { "mkdir", I_MKDIR, REMOTE, NOARGS }, + { "mget", I_GET, REMOTE, LOCAL }, + { "mput", I_PUT, LOCAL, REMOTE }, + { "progress", I_PROGRESS, NOARGS, NOARGS }, + { "put", I_PUT, LOCAL, REMOTE }, + { "pwd", I_PWD, REMOTE, NOARGS }, + { "quit", I_QUIT, NOARGS, NOARGS }, + { "reget", I_REGET, REMOTE, LOCAL }, + { "rename", I_RENAME, REMOTE, REMOTE }, + { "reput", I_REPUT, LOCAL, REMOTE }, + { "rm", I_RM, REMOTE, NOARGS }, + { "rmdir", I_RMDIR, REMOTE, NOARGS }, + { "symlink", I_SYMLINK, REMOTE, REMOTE }, + { "version", I_VERSION, NOARGS, NOARGS }, + { "!", I_SHELL, NOARGS, NOARGS }, + { "?", I_HELP, NOARGS, NOARGS }, + { NULL, -1, -1, -1 } }; /* ARGSUSED */ @@ -1945,19 +1946,25 @@ complete_cmd_parse(EditLine *el, char *cmd, int lastarg, char quote, } /* - * Determine whether a particular sftp command's arguments (if any) - * represent local or remote files. + * Determine whether a particular sftp command's arguments (if any) represent + * local or remote files. The "cmdarg" argument specifies the actual argument + * and accepts values 1 or 2. */ static int -complete_is_remote(char *cmd) { +complete_is_remote(char *cmd, int cmdarg) { int i; if (cmd == NULL) return -1; for (i = 0; cmds[i].c; i++) { - if (!strncasecmp(cmd, cmds[i].c, strlen(cmds[i].c))) - return cmds[i].t; + if (!strncasecmp(cmd, cmds[i].c, strlen(cmds[i].c))) { + if (cmdarg == 1) + return cmds[i].t; + else if (cmdarg == 2) + return cmds[i].t2; + break; + } } return -1; @@ -2137,12 +2144,28 @@ complete(EditLine *el, int ch) ret = CC_REDISPLAY; } else if (carg >= 1) { /* Handle file parsing */ - int remote = complete_is_remote(argv[0]); + int remote = 0; + int i = 0, cmdarg = 0; char *filematch = NULL; if (carg > 1 && line[cursor-1] != ' ') filematch = argv[carg - 1]; + for (i = 1; i < carg; i++) { + /* Skip flags */ + if (argv[i][0] != '-') + cmdarg++; + } + + /* + * If previous argument is complete, then offer completion + * on the next one. + */ + if (line[cursor - 1] == ' ') + cmdarg++; + + remote = complete_is_remote(argv[0], cmdarg); + if ((remote == REMOTE || remote == LOCAL) && complete_match(el, complete_ctx->conn, *complete_ctx->remote_pathp, filematch, From 30b2a7e4291fb9e357f80a237931ff008d686d3b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Fri, 16 Sep 2022 06:55:37 +0000 Subject: [PATCH 249/287] upstream: correct error value OpenBSD-Commit-ID: 780efcbad76281f11f14b2a5ff04eb6db3dfdad4 --- sftp-server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sftp-server.c b/sftp-server.c index 85f4345e9..8f30c1815 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.141 2022/08/12 05:20:28 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.142 2022/09/16 06:55:37 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1701,7 +1701,7 @@ process_extended_home_directory(u_int32_t id) debug3("request %u: home-directory \"%s\"", id, username); if ((user_pw = getpwnam(username)) == NULL) { - send_status(id, errno_to_portable(errno)); + send_status(id, SSH2_FX_FAILURE); goto out; } From 3991a0cf947cf3ae0f0373bcec5a90e86a7152f5 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sat, 17 Sep 2022 10:11:29 +0000 Subject: [PATCH 250/287] upstream: actually hook up restrict_websafe; the command-line flag was never actually used. Spotted by Matthew Garrett OpenBSD-Commit-ID: 0b363518ac4c2819dbaa3dfad4028633ab9cdff1 --- ssh-agent.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ssh-agent.c b/ssh-agent.c index 0aef07eb5..006ddad94 100644 --- a/ssh-agent.c +++ b/ssh-agent.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-agent.c,v 1.291 2022/09/14 00:13:13 djm Exp $ */ +/* $OpenBSD: ssh-agent.c,v 1.292 2022/09/17 10:11:29 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -808,7 +808,8 @@ process_sign_request2(SocketEntry *e) goto send; } if (sshkey_is_sk(id->key)) { - if (strncmp(id->key->sk_application, "ssh:", 4) != 0 && + if (restrict_websafe && + strncmp(id->key->sk_application, "ssh:", 4) != 0 && !check_websafe_message_contents(key, data)) { /* error already logged */ goto send; From 07d8771bacfefbcfb37fa8a6dc6103bcc097e0ab Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sat, 17 Sep 2022 10:30:45 +0000 Subject: [PATCH 251/287] upstream: Add a sshkey_check_rsa_length() call for checking the length of an RSA key; ok markus@ OpenBSD-Commit-ID: de77cd5b11594297eda82edc594b0d32b8535134 --- sshkey.c | 26 ++++++++++++++++---------- sshkey.h | 3 ++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/sshkey.c b/sshkey.c index ed2b5dff6..770932357 100644 --- a/sshkey.c +++ b/sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.121 2022/05/05 01:04:14 djm Exp $ */ +/* $OpenBSD: sshkey.c,v 1.122 2022/09/17 10:30:45 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -2365,18 +2365,24 @@ cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf) return ret; } -#ifdef WITH_OPENSSL -static int -check_rsa_length(const RSA *rsa) +int +sshkey_check_rsa_length(const struct sshkey *k, int min_size) { +#ifdef WITH_OPENSSL const BIGNUM *rsa_n; + int nbits; - RSA_get0_key(rsa, &rsa_n, NULL, NULL); - if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE) + if (k == NULL || k->rsa == NULL || + (k->type != KEY_RSA && k->type != KEY_RSA_CERT)) + return 0; + RSA_get0_key(k->rsa, &rsa_n, NULL, NULL); + nbits = BN_num_bits(rsa_n); + if (nbits < SSH_RSA_MINIMUM_MODULUS_SIZE || + (min_size > 0 && nbits < min_size)) return SSH_ERR_KEY_LENGTH; +#endif /* WITH_OPENSSL */ return 0; } -#endif static int sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, @@ -2439,7 +2445,7 @@ sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp, goto out; } rsa_n = rsa_e = NULL; /* transferred */ - if ((ret = check_rsa_length(key->rsa)) != 0) + if ((ret = sshkey_check_rsa_length(key, 0)) != 0) goto out; #ifdef DEBUG_PK RSA_print_fp(stderr, key->rsa, 8); @@ -3642,7 +3648,7 @@ sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp) goto out; } rsa_p = rsa_q = NULL; /* transferred */ - if ((r = check_rsa_length(k->rsa)) != 0) + if ((r = sshkey_check_rsa_length(k, 0)) != 0) goto out; if ((r = ssh_rsa_complete_crt_parameters(k, rsa_iqmp)) != 0) goto out; @@ -4644,7 +4650,7 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if ((r = check_rsa_length(prv->rsa)) != 0) + if ((r = sshkey_check_rsa_length(prv, 0)) != 0) goto out; } else if (EVP_PKEY_base_id(pk) == EVP_PKEY_DSA && (type == KEY_UNSPEC || type == KEY_DSA)) { diff --git a/sshkey.h b/sshkey.h index 094815e00..be254e6be 100644 --- a/sshkey.h +++ b/sshkey.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.h,v 1.51 2022/01/06 22:05:42 djm Exp $ */ +/* $OpenBSD: sshkey.h,v 1.52 2022/09/17 10:30:45 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -273,6 +273,7 @@ int sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type, int sshkey_parse_pubkey_from_private_fileblob_type(struct sshbuf *blob, int type, struct sshkey **pubkeyp); +int sshkey_check_rsa_length(const struct sshkey *, int); /* XXX should be internal, but used by ssh-keygen */ int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *); From 54b333d12e55e6560b328c737d514ff3511f1afd Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sat, 17 Sep 2022 10:33:18 +0000 Subject: [PATCH 252/287] upstream: add a RequiredRSASize for checking RSA key length in ssh(1). User authentication keys that fall beneath this limit will be ignored. If a host presents a host key beneath this limit then the connection will be terminated (unfortunately there are no fallbacks in the protocol for host authentication). feedback deraadt, Dmitry Belyavskiy; ok markus@ OpenBSD-Commit-ID: 430e339b2a79fa9ecc63f2837b06fdd88a7da13a --- readconf.c | 13 +++++++++++-- readconf.h | 4 +++- ssh.1 | 5 +++-- ssh.c | 27 ++++++++++++++++++--------- ssh_config.5 | 15 +++++++++++++-- sshconnect2.c | 20 +++++++++++++++++++- 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/readconf.c b/readconf.c index 7f26c6804..42be690b1 100644 --- a/readconf.c +++ b/readconf.c @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.368 2022/06/03 04:30:47 djm Exp $ */ +/* $OpenBSD: readconf.c,v 1.369 2022/09/17 10:33:18 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -174,7 +174,7 @@ typedef enum { oStreamLocalBindMask, oStreamLocalBindUnlink, oRevokedHostKeys, oFingerprintHash, oUpdateHostkeys, oHostbasedAcceptedAlgorithms, oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump, - oSecurityKeyProvider, oKnownHostsCommand, + oSecurityKeyProvider, oKnownHostsCommand, oRequiredRSASize, oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported } OpCodes; @@ -320,6 +320,7 @@ static struct { { "proxyjump", oProxyJump }, { "securitykeyprovider", oSecurityKeyProvider }, { "knownhostscommand", oKnownHostsCommand }, + { "requiredrsasize", oRequiredRSASize }, { NULL, oBadOption } }; @@ -2176,6 +2177,10 @@ parse_pubkey_algos: *charptr = xstrdup(arg); break; + case oRequiredRSASize: + intptr = &options->required_rsa_size; + goto parse_int; + case oDeprecated: debug("%s line %d: Deprecated option \"%s\"", filename, linenum, keyword); @@ -2423,6 +2428,7 @@ initialize_options(Options * options) options->hostbased_accepted_algos = NULL; options->pubkey_accepted_algos = NULL; options->known_hosts_command = NULL; + options->required_rsa_size = -1; } /* @@ -2619,6 +2625,8 @@ fill_default_options(Options * options) if (options->sk_provider == NULL) options->sk_provider = xstrdup("$SSH_SK_PROVIDER"); #endif + if (options->required_rsa_size == -1) + options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE; /* Expand KEX name lists */ all_cipher = cipher_alg_list(',', 0); @@ -3308,6 +3316,7 @@ dump_client_config(Options *o, const char *host) dump_cfg_int(oNumberOfPasswordPrompts, o->number_of_password_prompts); dump_cfg_int(oServerAliveCountMax, o->server_alive_count_max); dump_cfg_int(oServerAliveInterval, o->server_alive_interval); + dump_cfg_int(oRequiredRSASize, o->required_rsa_size); /* String options */ dump_cfg_string(oBindAddress, o->bind_address); diff --git a/readconf.h b/readconf.h index f647bd42a..ffb5ec4f2 100644 --- a/readconf.h +++ b/readconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.h,v 1.147 2022/06/03 04:30:47 djm Exp $ */ +/* $OpenBSD: readconf.h,v 1.148 2022/09/17 10:33:18 djm Exp $ */ /* * Author: Tatu Ylonen @@ -176,6 +176,8 @@ typedef struct { char *known_hosts_command; + int required_rsa_size; /* minimum size of RSA keys */ + char *ignored_unknown; /* Pattern list of unknown tokens to ignore */ } Options; diff --git a/ssh.1 b/ssh.1 index b4956aec9..e255b9b9d 100644 --- a/ssh.1 +++ b/ssh.1 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.431 2022/05/28 05:57:56 jmc Exp $ -.Dd $Mdocdate: May 28 2022 $ +.\" $OpenBSD: ssh.1,v 1.432 2022/09/17 10:33:18 djm Exp $ +.Dd $Mdocdate: September 17 2022 $ .Dt SSH 1 .Os .Sh NAME @@ -571,6 +571,7 @@ For full details of the options listed below, and their possible values, see .It RemoteCommand .It RemoteForward .It RequestTTY +.It RequiredRSASize .It SendEnv .It ServerAliveInterval .It ServerAliveCountMax diff --git a/ssh.c b/ssh.c index 559bf2aff..25be53d56 100644 --- a/ssh.c +++ b/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.575 2022/07/01 00:36:30 djm Exp $ */ +/* $OpenBSD: ssh.c,v 1.576 2022/09/17 10:33:18 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -516,14 +516,22 @@ resolve_canonicalize(char **hostp, int port) } /* - * Check the result of hostkey loading, ignoring some errors and - * fatal()ing for others. + * Check the result of hostkey loading, ignoring some errors and either + * discarding the key or fatal()ing for others. */ static void -check_load(int r, const char *path, const char *message) +check_load(int r, struct sshkey **k, const char *path, const char *message) { switch (r) { case 0: + /* Check RSA keys size and discard if undersized */ + if (k != NULL && *k != NULL && + (r = sshkey_check_rsa_length(*k, + options.required_rsa_size)) != 0) { + error_r(r, "load %s \"%s\"", message, path); + free(*k); + *k = NULL; + } break; case SSH_ERR_INTERNAL_ERROR: case SSH_ERR_ALLOC_FAIL: @@ -1578,7 +1586,7 @@ main(int ac, char **av) if ((o) >= sensitive_data.nkeys) \ fatal_f("pubkey out of array bounds"); \ check_load(sshkey_load_public(p, &(sensitive_data.keys[o]), NULL), \ - p, "pubkey"); \ + &(sensitive_data.keys[o]), p, "pubkey"); \ if (sensitive_data.keys[o] != NULL) \ debug2("hostbased key %d: %s key from \"%s\"", o, \ sshkey_ssh_name(sensitive_data.keys[o]), p); \ @@ -1586,7 +1594,8 @@ main(int ac, char **av) #define L_CERT(p,o) do { \ if ((o) >= sensitive_data.nkeys) \ fatal_f("cert out of array bounds"); \ - check_load(sshkey_load_cert(p, &(sensitive_data.keys[o])), p, "cert"); \ + check_load(sshkey_load_cert(p, &(sensitive_data.keys[o])), \ + &(sensitive_data.keys[o]), p, "cert"); \ if (sensitive_data.keys[o] != NULL) \ debug2("hostbased key %d: %s cert from \"%s\"", o, \ sshkey_ssh_name(sensitive_data.keys[o]), p); \ @@ -2265,7 +2274,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo) filename = default_client_percent_dollar_expand(cp, cinfo); free(cp); check_load(sshkey_load_public(filename, &public, NULL), - filename, "pubkey"); + &public, filename, "pubkey"); debug("identity file %s type %d", filename, public ? public->type : -1); free(options.identity_files[i]); @@ -2284,7 +2293,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo) continue; xasprintf(&cp, "%s-cert", filename); check_load(sshkey_load_public(cp, &public, NULL), - filename, "pubkey"); + &public, filename, "pubkey"); debug("identity file %s type %d", cp, public ? public->type : -1); if (public == NULL) { @@ -2315,7 +2324,7 @@ load_public_identity_files(const struct ssh_conn_info *cinfo) free(cp); check_load(sshkey_load_public(filename, &public, NULL), - filename, "certificate"); + &public, filename, "certificate"); debug("certificate file %s type %d", filename, public ? public->type : -1); free(options.certificate_files[i]); diff --git a/ssh_config.5 b/ssh_config.5 index 24a464600..d1ede18e7 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.373 2022/06/24 04:27:14 djm Exp $ -.Dd $Mdocdate: June 24 2022 $ +.\" $OpenBSD: ssh_config.5,v 1.374 2022/09/17 10:33:18 djm Exp $ +.Dd $Mdocdate: September 17 2022 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -1634,6 +1634,17 @@ and .Fl T flags for .Xr ssh 1 . +.It Cm RequiredRSASize +Specifies the minimum RSA key size (in bits) that +.Xr ssh 1 +will accept. +User authentication keys smaller than this limit will be ignored. +Servers that present host keys smaller than this limit will cause the +connection to be terminated. +The default is +.Cm 1024 +bits. +Note that this limit may only be raised from the default. .It Cm RevokedHostKeys Specifies revoked host public keys. Keys listed in this file will be refused for host authentication. diff --git a/sshconnect2.c b/sshconnect2.c index f9bd19ea7..58fe98db2 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.360 2022/08/19 06:07:47 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.361 2022/09/17 10:33:18 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -96,6 +96,11 @@ static const struct ssh_conn_info *xxx_conn_info; static int verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh) { + int r; + + if ((r = sshkey_check_rsa_length(hostkey, + options.required_rsa_size)) != 0) + fatal_r(r, "Bad server host key"); if (verify_host_key(xxx_host, xxx_hostaddr, hostkey, xxx_conn_info) == -1) fatal("Host key verification failed."); @@ -1606,6 +1611,13 @@ load_identity_file(Identity *id) private = NULL; quit = 1; } + if (!quit && (r = sshkey_check_rsa_length(private, + options.required_rsa_size)) != 0) { + debug_fr(r, "Skipping key %s", id->filename); + sshkey_free(private); + private = NULL; + quit = 1; + } if (!quit && private != NULL && id->agent_fd == -1 && !(id->key && id->isprivate)) maybe_add_key_to_agent(id->filename, private, comment, @@ -1752,6 +1764,12 @@ pubkey_prepare(struct ssh *ssh, Authctxt *authctxt) /* list of keys supported by the agent */ if ((r = get_agent_identities(ssh, &agent_fd, &idlist)) == 0) { for (j = 0; j < idlist->nkeys; j++) { + if ((r = sshkey_check_rsa_length(idlist->keys[j], + options.required_rsa_size)) != 0) { + debug_fr(r, "ignoring %s agent key", + sshkey_ssh_name(idlist->keys[j])); + continue; + } found = 0; TAILQ_FOREACH(id, &files, next) { /* From 1875042c52a3b950ae5963c9ca3774a4cc7f0380 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Sat, 17 Sep 2022 10:34:29 +0000 Subject: [PATCH 253/287] upstream: Add RequiredRSASize for sshd(8); RSA keys that fall beneath this limit will be ignored for user and host-based authentication. Feedback deraadt@ ok markus@ OpenBSD-Commit-ID: 187931dfc19d51873df5930a04f2d972adf1f7f1 --- auth2-hostbased.c | 7 ++++++- auth2-pubkey.c | 7 ++++++- servconf.c | 13 ++++++++++++- servconf.h | 3 ++- sshd.c | 9 ++++++++- sshd_config.5 | 14 ++++++++++++-- 6 files changed, 46 insertions(+), 7 deletions(-) diff --git a/auth2-hostbased.c b/auth2-hostbased.c index 36b9d2f5b..6b517db41 100644 --- a/auth2-hostbased.c +++ b/auth2-hostbased.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-hostbased.c,v 1.49 2022/01/06 22:01:14 djm Exp $ */ +/* $OpenBSD: auth2-hostbased.c,v 1.50 2022/09/17 10:34:29 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -119,6 +119,11 @@ userauth_hostbased(struct ssh *ssh, const char *method) "(null)" : key->cert->signature_type); goto done; } + if ((r = sshkey_check_rsa_length(key, + options.required_rsa_size)) != 0) { + logit_r(r, "refusing %s key", sshkey_type(key)); + goto done; + } if (!authctxt->valid || authctxt->user == NULL) { debug2_f("disabled because of invalid user"); diff --git a/auth2-pubkey.c b/auth2-pubkey.c index 962fd3420..5d59febc3 100644 --- a/auth2-pubkey.c +++ b/auth2-pubkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auth2-pubkey.c,v 1.116 2022/06/15 16:08:25 djm Exp $ */ +/* $OpenBSD: auth2-pubkey.c,v 1.117 2022/09/17 10:34:29 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -175,6 +175,11 @@ userauth_pubkey(struct ssh *ssh, const char *method) "(null)" : key->cert->signature_type); goto done; } + if ((r = sshkey_check_rsa_length(key, + options.required_rsa_size)) != 0) { + logit_r(r, "refusing %s key", sshkey_type(key)); + goto done; + } key_s = format_key(key); if (sshkey_is_cert(key)) ca_s = format_key(key->cert->signature_key); diff --git a/servconf.c b/servconf.c index 29df0463d..423772b15 100644 --- a/servconf.c +++ b/servconf.c @@ -1,5 +1,5 @@ -/* $OpenBSD: servconf.c,v 1.385 2022/06/03 04:30:47 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.386 2022/09/17 10:34:29 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland * All rights reserved @@ -195,6 +195,7 @@ initialize_server_options(ServerOptions *options) options->fingerprint_hash = -1; options->disable_forwarding = -1; options->expose_userauth_info = -1; + options->required_rsa_size = -1; } /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ @@ -441,6 +442,8 @@ fill_default_server_options(ServerOptions *options) options->expose_userauth_info = 0; if (options->sk_provider == NULL) options->sk_provider = xstrdup("internal"); + if (options->required_rsa_size == -1) + options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE; assemble_algorithms(options); @@ -517,6 +520,7 @@ typedef enum { sStreamLocalBindMask, sStreamLocalBindUnlink, sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding, sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, + sRequiredRSASize, sDeprecated, sIgnore, sUnsupported } ServerOpCodes; @@ -676,6 +680,7 @@ static struct { { "rdomain", sRDomain, SSHCFG_ALL }, { "casignaturealgorithms", sCASignatureAlgorithms, SSHCFG_ALL }, { "securitykeyprovider", sSecurityKeyProvider, SSHCFG_GLOBAL }, + { "requiredrsasize", sRequiredRSASize, SSHCFG_ALL }, { NULL, sBadOption, 0 } }; @@ -2438,6 +2443,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, *charptr = xstrdup(arg); break; + case sRequiredRSASize: + intptr = &options->required_rsa_size; + goto parse_int; + case sDeprecated: case sIgnore: case sUnsupported: @@ -2610,6 +2619,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) M_CP_INTOPT(rekey_limit); M_CP_INTOPT(rekey_interval); M_CP_INTOPT(log_level); + M_CP_INTOPT(required_rsa_size); /* * The bind_mask is a mode_t that may be unsigned, so we can't use @@ -2874,6 +2884,7 @@ dump_config(ServerOptions *o) dump_cfg_int(sMaxSessions, o->max_sessions); dump_cfg_int(sClientAliveInterval, o->client_alive_interval); dump_cfg_int(sClientAliveCountMax, o->client_alive_count_max); + dump_cfg_int(sRequiredRSASize, o->required_rsa_size); dump_cfg_oct(sStreamLocalBindMask, o->fwd_opts.streamlocal_bind_mask); /* formatted integer arguments */ diff --git a/servconf.h b/servconf.h index 8a04463e0..9346155ce 100644 --- a/servconf.h +++ b/servconf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.156 2022/03/18 04:04:11 djm Exp $ */ +/* $OpenBSD: servconf.h,v 1.157 2022/09/17 10:34:29 djm Exp $ */ /* * Author: Tatu Ylonen @@ -229,6 +229,7 @@ typedef struct { int expose_userauth_info; u_int64_t timing_secret; char *sk_provider; + int required_rsa_size; /* minimum size of RSA keys */ } ServerOptions; /* Information about the incoming connection as used by Match */ diff --git a/sshd.c b/sshd.c index 17eee9d83..395ef493d 100644 --- a/sshd.c +++ b/sshd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.590 2022/07/01 05:08:23 dtucker Exp $ */ +/* $OpenBSD: sshd.c,v 1.591 2022/09/17 10:34:29 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -1870,6 +1870,13 @@ main(int ac, char **av) fatal_r(r, "Could not demote key: \"%s\"", options.host_key_files[i]); } + if (pubkey != NULL && (r = sshkey_check_rsa_length(pubkey, + options.required_rsa_size)) != 0) { + error_fr(r, "Host key %s", options.host_key_files[i]); + sshkey_free(pubkey); + sshkey_free(key); + continue; + } sensitive_data.host_keys[i] = key; sensitive_data.host_pubkeys[i] = pubkey; diff --git a/sshd_config.5 b/sshd_config.5 index 867a747d6..f5a06637f 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.342 2022/06/24 04:27:14 djm Exp $ -.Dd $Mdocdate: June 24 2022 $ +.\" $OpenBSD: sshd_config.5,v 1.343 2022/09/17 10:34:29 djm Exp $ +.Dd $Mdocdate: September 17 2022 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -1596,6 +1596,16 @@ is .Cm default none , which means that rekeying is performed after the cipher's default amount of data has been sent or received and no time based rekeying is done. +.It Cm RequiredRSASize +Specifies the minimum RSA key size (in bits) that +.Xr sshd 8 +will accept. +User and host-based authentication keys smaller than this limit will be +refused. +The default is +.Cm 1024 +bits. +Note that this limit may only be raised from the default. .It Cm RevokedKeys Specifies revoked public keys file, or .Cm none From 231a346c0c67cc7ca098360f9a554fa7d4f1eddb Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 19 Sep 2022 08:49:50 +0000 Subject: [PATCH 254/287] upstream: better debugging for connect_next() OpenBSD-Commit-ID: d16a307a0711499c971807f324484ed3a6036640 --- channels.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/channels.c b/channels.c index 3ac51bac2..6a78de9d5 100644 --- a/channels.c +++ b/channels.c @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.419 2022/05/05 00:56:58 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.420 2022/09/19 08:49:50 djm Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland @@ -4403,13 +4403,15 @@ connect_next(struct channel_connect *cctx) if (getnameinfo(cctx->ai->ai_addr, cctx->ai->ai_addrlen, ntop, sizeof(ntop), strport, sizeof(strport), NI_NUMERICHOST|NI_NUMERICSERV) != 0) { - error("connect_next: getnameinfo failed"); + error_f("getnameinfo failed"); continue; } break; default: continue; } + debug_f("start for host %.100s ([%.100s]:%s)", + cctx->host, ntop, strport); if ((sock = socket(cctx->ai->ai_family, cctx->ai->ai_socktype, cctx->ai->ai_protocol)) == -1) { if (cctx->ai->ai_next == NULL) @@ -4422,9 +4424,8 @@ connect_next(struct channel_connect *cctx) fatal_f("set_nonblock(%d)", sock); if (connect(sock, cctx->ai->ai_addr, cctx->ai->ai_addrlen) == -1 && errno != EINPROGRESS) { - debug("connect_next: host %.100s ([%.100s]:%s): " - "%.100s", cctx->host, ntop, strport, - strerror(errno)); + debug_f("host %.100s ([%.100s]:%s): %.100s", + cctx->host, ntop, strport, strerror(errno)); saved_errno = errno; close(sock); errno = saved_errno; @@ -4432,8 +4433,8 @@ connect_next(struct channel_connect *cctx) } if (cctx->ai->ai_family != AF_UNIX) set_nodelay(sock); - debug("connect_next: host %.100s ([%.100s]:%s) " - "in progress, fd=%d", cctx->host, ntop, strport, sock); + debug_f("connect host %.100s ([%.100s]:%s) in progress, fd=%d", + cctx->host, ntop, strport, sock); cctx->ai = cctx->ai->ai_next; return sock; } From 74b77f7497dba3a58315c8f308883de448078057 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 19 Sep 2022 10:40:52 +0000 Subject: [PATCH 255/287] upstream: sftp-server(8): add a "users-groups-by-id@openssh.com" extension request that allows the client to obtain user/group names that correspond to a set of uids/gids. Will be used to make directory listings more useful and consistent in sftp(1). ok markus@ OpenBSD-Commit-ID: 7ebabde0bcb95ef949c4840fe89e697e30df47d3 --- PROTOCOL | 43 ++++++++++++++++++++++++++++++++++- sftp-server.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/PROTOCOL b/PROTOCOL index 28ad9e0b3..685f90fa8 100644 --- a/PROTOCOL +++ b/PROTOCOL @@ -635,6 +635,47 @@ This request is identical to the "home-directory" request documented in: https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-extensions-00#section-5 +4.12. sftp: Extension request "users-groups-by-id@openssh.com" + +This request asks the server to returns user and/or group names that +correspond to one or more IDs (e.g. as returned from a SSH_FXP_STAT +request). This may be used by the client to provide usernames in +directory listings. + + byte SSH_FXP_EXTENDED + uint32 id + string "users-groups-by-id@openssh.com" + string uids + string gids + +Where "uids" and "gids" consists of one or more integer user or group +identifiers: + + uint32 id-0 + ... + +The server will reply with a SSH_FXP_EXTENDED_REPLY: + + byte SSH_FXP_EXTENDED_REPLY + string usernames + string groupnames + +Where "username" and "groupnames" consists of names in identical request +order to "uids" and "gids" respectively: + + string name-0 + ... + +If a name cannot be identified for a given user or group ID, an empty +string will be returned in its place. + +It is acceptable for either "uids" or "gids" to be an empty set, in +which case the respective "usernames" or "groupnames" list will also +be empty. + +This extension is advertised in the SSH_FXP_VERSION hello with version +"1". + 5. Miscellaneous changes 5.1 Public key format @@ -671,4 +712,4 @@ master instance and later clients. OpenSSH extends the usual agent protocol. These changes are documented in the PROTOCOL.agent file. -$OpenBSD: PROTOCOL,v 1.46 2022/08/12 05:20:28 djm Exp $ +$OpenBSD: PROTOCOL,v 1.47 2022/09/19 10:40:52 djm Exp $ diff --git a/sftp-server.c b/sftp-server.c index 8f30c1815..65547029d 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.142 2022/09/16 06:55:37 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.143 2022/09/19 10:40:52 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -37,6 +37,7 @@ #include #endif #include +#include #include #include #include @@ -122,6 +123,7 @@ static void process_extended_limits(u_int32_t id); static void process_extended_expand(u_int32_t id); static void process_extended_copy_data(u_int32_t id); static void process_extended_home_directory(u_int32_t id); +static void process_extended_get_users_groups_by_id(u_int32_t id); static void process_extended(u_int32_t id); struct sftp_handler { @@ -170,6 +172,8 @@ static const struct sftp_handler extended_handlers[] = { { "copy-data", "copy-data", 0, process_extended_copy_data, 1 }, { "home-directory", "home-directory", 0, process_extended_home_directory, 0 }, + { "users-groups-by-id", "users-groups-by-id@openssh.com", 0, + process_extended_get_users_groups_by_id, 0 }, { NULL, NULL, 0, NULL, 0 } }; @@ -728,6 +732,7 @@ process_init(void) compose_extension(msg, "expand-path@openssh.com", "1"); compose_extension(msg, "copy-data", "1"); compose_extension(msg, "home-directory", "1"); + compose_extension(msg, "users-groups-by-id@openssh.com", "1"); send_msg(msg); sshbuf_free(msg); @@ -1713,6 +1718,61 @@ process_extended_home_directory(u_int32_t id) free(username); } +static void +process_extended_get_users_groups_by_id(u_int32_t id) +{ + struct passwd *user_pw; + struct group *gr; + struct sshbuf *uids, *gids, *usernames, *groupnames, *msg; + int r; + u_int n, nusers = 0, ngroups = 0; + const char *name; + + if ((usernames = sshbuf_new()) == NULL || + (groupnames = sshbuf_new()) == NULL || + (msg = sshbuf_new()) == NULL) + fatal_f("sshbuf_new failed"); + if ((r = sshbuf_froms(iqueue, &uids)) != 0 || + (r = sshbuf_froms(iqueue, &gids)) != 0) + fatal_fr(r, "parse"); + debug_f("uids len = %zu, gids len = %zu", + sshbuf_len(uids), sshbuf_len(gids)); + while (sshbuf_len(uids) != 0) { + if ((r = sshbuf_get_u32(uids, &n)) != 0) + fatal_fr(r, "parse inner uid"); + user_pw = getpwuid((uid_t)n); + name = user_pw == NULL ? "" : user_pw->pw_name; + debug3_f("uid %u => \"%s\"", n, name); + if ((r = sshbuf_put_cstring(usernames, name)) != 0) + fatal_fr(r, "assemble gid reply"); + nusers++; + } + while (sshbuf_len(gids) != 0) { + if ((r = sshbuf_get_u32(gids, &n)) != 0) + fatal_fr(r, "parse inner gid"); + gr = getgrgid((gid_t)n); + name = gr == NULL ? "" : gr->gr_name; + debug3_f("gid %u => \"%s\"", n, name); + if ((r = sshbuf_put_cstring(groupnames, name)) != 0) + fatal_fr(r, "assemble gid reply"); + nusers++; + } + verbose("users-groups-by-id: %u users, %u groups", nusers, ngroups); + + if ((r = sshbuf_put_u8(msg, SSH2_FXP_EXTENDED_REPLY)) != 0 || + (r = sshbuf_put_u32(msg, id)) != 0 || + (r = sshbuf_put_stringb(msg, usernames)) != 0 || + (r = sshbuf_put_stringb(msg, groupnames)) != 0) + fatal_fr(r, "compose"); + send_msg(msg); + + sshbuf_free(uids); + sshbuf_free(gids); + sshbuf_free(usernames); + sshbuf_free(groupnames); + sshbuf_free(msg); +} + static void process_extended(u_int32_t id) { From 488f6e1c582212c2374a4bf8cd1b703d2e70fb8b Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 19 Sep 2022 10:41:58 +0000 Subject: [PATCH 256/287] upstream: extend sftp-common.c:extend ls_file() to support supplied user/group names; ok markus@ OpenBSD-Commit-ID: c70c70498b1fdcf158531117e405b6245863bfb0 --- sftp-common.c | 18 +++++++++++------- sftp-common.h | 5 +++-- sftp-server.c | 5 +++-- sftp.c | 6 +++--- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/sftp-common.c b/sftp-common.c index 3ad57673d..50f1bbafb 100644 --- a/sftp-common.c +++ b/sftp-common.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-common.c,v 1.32 2020/10/18 11:32:02 djm Exp $ */ +/* $OpenBSD: sftp-common.c,v 1.33 2022/09/19 10:41:58 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. * Copyright (c) 2001 Damien Miller. All rights reserved. @@ -212,21 +212,25 @@ fx2txt(int status) * drwxr-xr-x 5 markus markus 1024 Jan 13 18:39 .ssh */ char * -ls_file(const char *name, const struct stat *st, int remote, int si_units) +ls_file(const char *name, const struct stat *st, int remote, int si_units, + const char *user, const char *group) { int ulen, glen, sz = 0; struct tm *ltime = localtime(&st->st_mtime); - const char *user, *group; char buf[1024], lc[8], mode[11+1], tbuf[12+1], ubuf[11+1], gbuf[11+1]; char sbuf[FMT_SCALED_STRSIZE]; time_t now; strmode(st->st_mode, mode); if (remote) { - snprintf(ubuf, sizeof ubuf, "%u", (u_int)st->st_uid); - user = ubuf; - snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid); - group = gbuf; + if (user == NULL) { + snprintf(ubuf, sizeof ubuf, "%u", (u_int)st->st_uid); + user = ubuf; + } + if (group == NULL) { + snprintf(gbuf, sizeof gbuf, "%u", (u_int)st->st_gid); + group = gbuf; + } strlcpy(lc, "?", sizeof(lc)); } else { user = user_from_uid(st->st_uid, 0); diff --git a/sftp-common.h b/sftp-common.h index 2e778a9ca..421a78f78 100644 --- a/sftp-common.h +++ b/sftp-common.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-common.h,v 1.12 2015/01/14 13:54:13 djm Exp $ */ +/* $OpenBSD: sftp-common.h,v 1.13 2022/09/19 10:41:58 djm Exp $ */ /* * Copyright (c) 2001 Markus Friedl. All rights reserved. @@ -47,6 +47,7 @@ void stat_to_attrib(const struct stat *, Attrib *); void attrib_to_stat(const Attrib *, struct stat *); int decode_attrib(struct sshbuf *, Attrib *); int encode_attrib(struct sshbuf *, const Attrib *); -char *ls_file(const char *, const struct stat *, int, int); +char *ls_file(const char *, const struct stat *, int, int, + const char *, const char *); const char *fx2txt(int); diff --git a/sftp-server.c b/sftp-server.c index 65547029d..25f953489 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-server.c,v 1.143 2022/09/19 10:40:52 djm Exp $ */ +/* $OpenBSD: sftp-server.c,v 1.144 2022/09/19 10:41:58 djm Exp $ */ /* * Copyright (c) 2000-2004 Markus Friedl. All rights reserved. * @@ -1161,7 +1161,8 @@ process_readdir(u_int32_t id) continue; stat_to_attrib(&st, &(stats[count].attrib)); stats[count].name = xstrdup(dp->d_name); - stats[count].long_name = ls_file(dp->d_name, &st, 0, 0); + stats[count].long_name = ls_file(dp->d_name, &st, + 0, 0, NULL, NULL); count++; /* send up to 100 entries in one message */ /* XXX check packet size instead */ diff --git a/sftp.c b/sftp.c index 24568aade..2d1186ac2 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.220 2022/09/16 03:33:14 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.221 2022/09/19 10:41:58 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -889,7 +889,7 @@ do_ls_dir(struct sftp_conn *conn, const char *path, memset(&sb, 0, sizeof(sb)); attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, - (lflag & LS_SI_UNITS)); + (lflag & LS_SI_UNITS), NULL, NULL); mprintf("%s\n", lname); free(lname); } else @@ -1026,7 +1026,7 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, continue; } lname = ls_file(fname, g.gl_statv[i], 1, - (lflag & LS_SI_UNITS)); + (lflag & LS_SI_UNITS), NULL, NULL); mprintf("%s\n", lname); free(lname); } else { From 8ff680368b0bccf88ae85d4c99de69387fbad7a6 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 19 Sep 2022 10:43:12 +0000 Subject: [PATCH 257/287] upstream: sftp client library support for users-groups-by-id@openssh.com; ok markus@ OpenBSD-Commit-ID: ddb2f33a2da6349a9a89a8b5bcb9ca7c999394de --- sftp-client.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++---- sftp-client.h | 11 +++- 2 files changed, 140 insertions(+), 11 deletions(-) diff --git a/sftp-client.c b/sftp-client.c index 310d44e5e..35be53d69 100644 --- a/sftp-client.c +++ b/sftp-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.c,v 1.164 2022/05/15 23:47:21 djm Exp $ */ +/* $OpenBSD: sftp-client.c,v 1.165 2022/09/19 10:43:12 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -95,15 +95,16 @@ struct sftp_conn { u_int num_requests; u_int version; u_int msg_id; -#define SFTP_EXT_POSIX_RENAME 0x00000001 -#define SFTP_EXT_STATVFS 0x00000002 -#define SFTP_EXT_FSTATVFS 0x00000004 -#define SFTP_EXT_HARDLINK 0x00000008 -#define SFTP_EXT_FSYNC 0x00000010 -#define SFTP_EXT_LSETSTAT 0x00000020 -#define SFTP_EXT_LIMITS 0x00000040 -#define SFTP_EXT_PATH_EXPAND 0x00000080 -#define SFTP_EXT_COPY_DATA 0x00000100 +#define SFTP_EXT_POSIX_RENAME 0x00000001 +#define SFTP_EXT_STATVFS 0x00000002 +#define SFTP_EXT_FSTATVFS 0x00000004 +#define SFTP_EXT_HARDLINK 0x00000008 +#define SFTP_EXT_FSYNC 0x00000010 +#define SFTP_EXT_LSETSTAT 0x00000020 +#define SFTP_EXT_LIMITS 0x00000040 +#define SFTP_EXT_PATH_EXPAND 0x00000080 +#define SFTP_EXT_COPY_DATA 0x00000100 +#define SFTP_EXT_GETUSERSGROUPS_BY_ID 0x00000200 u_int exts; u_int64_t limit_kbps; struct bwlimit bwlimit_in, bwlimit_out; @@ -539,6 +540,11 @@ do_init(int fd_in, int fd_out, u_int transfer_buflen, u_int num_requests, strcmp((char *)value, "1") == 0) { ret->exts |= SFTP_EXT_COPY_DATA; known = 1; + } else if (strcmp(name, + "users-groups-by-id@openssh.com") == 0 && + strcmp((char *)value, "1") == 0) { + ret->exts |= SFTP_EXT_GETUSERSGROUPS_BY_ID; + known = 1; } if (known) { debug2("Server supports extension \"%s\" revision %s", @@ -2752,6 +2758,120 @@ crossload_dir(struct sftp_conn *from, struct sftp_conn *to, return ret; } +int +can_get_users_groups_by_id(struct sftp_conn *conn) +{ + return (conn->exts & SFTP_EXT_GETUSERSGROUPS_BY_ID) != 0; +} + +int +do_get_users_groups_by_id(struct sftp_conn *conn, + const u_int *uids, u_int nuids, + const u_int *gids, u_int ngids, + char ***usernamesp, char ***groupnamesp) +{ + struct sshbuf *msg, *uidbuf, *gidbuf; + u_int i, expected_id, id; + char *name, **usernames = NULL, **groupnames = NULL; + u_char type; + int r; + + *usernamesp = *groupnamesp = NULL; + if (!can_get_users_groups_by_id(conn)) + return SSH_ERR_FEATURE_UNSUPPORTED; + + if ((msg = sshbuf_new()) == NULL || + (uidbuf = sshbuf_new()) == NULL || + (gidbuf = sshbuf_new()) == NULL) + fatal_f("sshbuf_new failed"); + expected_id = id = conn->msg_id++; + debug2("Sending SSH2_FXP_EXTENDED(users-groups-by-id@openssh.com)"); + for (i = 0; i < nuids; i++) { + if ((r = sshbuf_put_u32(uidbuf, uids[i])) != 0) + fatal_fr(r, "compose uids"); + } + for (i = 0; i < ngids; i++) { + if ((r = sshbuf_put_u32(gidbuf, gids[i])) != 0) + fatal_fr(r, "compose gids"); + } + if ((r = sshbuf_put_u8(msg, SSH2_FXP_EXTENDED)) != 0 || + (r = sshbuf_put_u32(msg, id)) != 0 || + (r = sshbuf_put_cstring(msg, + "users-groups-by-id@openssh.com")) != 0 || + (r = sshbuf_put_stringb(msg, uidbuf)) != 0 || + (r = sshbuf_put_stringb(msg, gidbuf)) != 0) + fatal_fr(r, "compose"); + send_msg(conn, msg); + get_msg(conn, msg); + if ((r = sshbuf_get_u8(msg, &type)) != 0 || + (r = sshbuf_get_u32(msg, &id)) != 0) + fatal_fr(r, "parse"); + if (id != expected_id) + fatal("ID mismatch (%u != %u)", id, expected_id); + if (type == SSH2_FXP_STATUS) { + u_int status; + char *errmsg; + + if ((r = sshbuf_get_u32(msg, &status)) != 0 || + (r = sshbuf_get_cstring(msg, &errmsg, NULL)) != 0) + fatal_fr(r, "parse status"); + error("users-groups-by-id %s", + *errmsg == '\0' ? fx2txt(status) : errmsg); + free(errmsg); + sshbuf_free(msg); + sshbuf_free(uidbuf); + sshbuf_free(gidbuf); + return -1; + } else if (type != SSH2_FXP_EXTENDED_REPLY) + fatal("Expected SSH2_FXP_EXTENDED_REPLY(%u) packet, got %u", + SSH2_FXP_EXTENDED_REPLY, type); + + /* reuse */ + sshbuf_free(uidbuf); + sshbuf_free(gidbuf); + uidbuf = gidbuf = NULL; + if ((r = sshbuf_froms(msg, &uidbuf)) != 0 || + (r = sshbuf_froms(msg, &gidbuf)) != 0) + fatal_fr(r, "parse response"); + if (nuids > 0) { + usernames = xcalloc(nuids, sizeof(*usernames)); + for (i = 0; i < nuids; i++) { + if ((r = sshbuf_get_cstring(uidbuf, &name, NULL)) != 0) + fatal_fr(r, "parse user name"); + /* Handle unresolved names */ + if (*name == '\0') { + free(name); + name = NULL; + } + usernames[i] = name; + } + } + if (ngids > 0) { + groupnames = xcalloc(ngids, sizeof(*groupnames)); + for (i = 0; i < ngids; i++) { + if ((r = sshbuf_get_cstring(gidbuf, &name, NULL)) != 0) + fatal_fr(r, "parse user name"); + /* Handle unresolved names */ + if (*name == '\0') { + free(name); + name = NULL; + } + groupnames[i] = name; + } + } + if (sshbuf_len(uidbuf) != 0) + fatal_f("unexpected extra username data"); + if (sshbuf_len(gidbuf) != 0) + fatal_f("unexpected extra groupname data"); + sshbuf_free(uidbuf); + sshbuf_free(gidbuf); + sshbuf_free(msg); + /* success */ + *usernamesp = usernames; + *groupnamesp = groupnames; + return 0; +} + char * path_append(const char *p1, const char *p2) { diff --git a/sftp-client.h b/sftp-client.h index 7ca6e8ad9..d7deab17e 100644 --- a/sftp-client.h +++ b/sftp-client.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp-client.h,v 1.37 2022/05/13 06:31:50 djm Exp $ */ +/* $OpenBSD: sftp-client.h,v 1.38 2022/09/19 10:43:12 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller @@ -183,6 +183,15 @@ int crossload_dir(struct sftp_conn *from, struct sftp_conn *to, Attrib *dirattrib, int preserve_flag, int print_flag, int follow_link_flag); +/* + * User/group ID to name translation. + */ +int can_get_users_groups_by_id(struct sftp_conn *conn); +int do_get_users_groups_by_id(struct sftp_conn *conn, + const u_int *uids, u_int nuids, + const u_int *gids, u_int ngids, + char ***usernamesp, char ***groupnamesp); + /* Concatenate paths, taking care of slashes. Caller must free result. */ char *path_append(const char *, const char *); From 9d952529113831fb3071ab6e408d2726fd72e771 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" Date: Mon, 19 Sep 2022 10:46:00 +0000 Subject: [PATCH 258/287] upstream: use users-groups-by-id@openssh.com sftp-server extension (when available) to fill in user/group names for directory listings. Implement a client-side cache of see uid/gid=>user/group names. ok markus@ OpenBSD-Commit-ID: f239aeeadfa925a37ceee36ee8b256b8ccf4466e --- Makefile.in | 2 +- sftp-usergroup.c | 240 +++++++++++++++++++++++++++++++++++++++++++++++ sftp-usergroup.h | 25 +++++ sftp.c | 16 +++- 4 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 sftp-usergroup.c create mode 100644 sftp-usergroup.h diff --git a/Makefile.in b/Makefile.in index 778c66cff..5dde2baa0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -153,7 +153,7 @@ SSHKEYSCAN_OBJS=ssh-keyscan.o $(SKOBJS) SFTPSERVER_OBJS=sftp-common.o sftp-server.o sftp-server-main.o -SFTP_OBJS= sftp.o progressmeter.o $(SFTP_CLIENT_OBJS) +SFTP_OBJS= sftp.o sftp-usergroup.o progressmeter.o $(SFTP_CLIENT_OBJS) MANPAGES = moduli.5.out scp.1.out ssh-add.1.out ssh-agent.1.out ssh-keygen.1.out ssh-keyscan.1.out ssh.1.out sshd.8.out sftp-server.8.out sftp.1.out ssh-keysign.8.out ssh-pkcs11-helper.8.out ssh-sk-helper.8.out sshd_config.5.out ssh_config.5.out MANPAGES_IN = moduli.5 scp.1 ssh-add.1 ssh-agent.1 ssh-keygen.1 ssh-keyscan.1 ssh.1 sshd.8 sftp-server.8 sftp.1 ssh-keysign.8 ssh-pkcs11-helper.8 ssh-sk-helper.8 sshd_config.5 ssh_config.5 diff --git a/sftp-usergroup.c b/sftp-usergroup.c new file mode 100644 index 000000000..fa06fd0ac --- /dev/null +++ b/sftp-usergroup.c @@ -0,0 +1,240 @@ +/* + * Copyright (c) 2022 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* sftp client user/group lookup and caching */ + +#include "includes.h" + +#include +#include + +#include +#include +#include +#include + +#include "log.h" +#include "xmalloc.h" + +#include "sftp-common.h" +#include "sftp-client.h" +#include "sftp-usergroup.h" + +/* Tree of id, name */ +struct idname { + u_int id; + char *name; + RB_ENTRY(idname) entry; + /* XXX implement bounded cache as TAILQ */ +}; +static int +idname_cmp(struct idname *a, struct idname *b) +{ + if (a->id == b->id) + return 0; + return a->id > b->id ? 1 : -1; +} +RB_HEAD(idname_tree, idname); +RB_GENERATE_STATIC(idname_tree, idname, entry, idname_cmp) + +static struct idname_tree user_idname = RB_INITIALIZER(&user_idname); +static struct idname_tree group_idname = RB_INITIALIZER(&group_idname); + +static void +idname_free(struct idname *idname) +{ + if (idname == NULL) + return; + free(idname->name); + free(idname); +} + +static void +idname_enter(struct idname_tree *tree, u_int id, const char *name) +{ + struct idname *idname; + + if ((idname = xcalloc(1, sizeof(*idname))) == NULL) + fatal_f("alloc"); + idname->id = id; + idname->name = xstrdup(name); + if (RB_INSERT(idname_tree, tree, idname) != NULL) + idname_free(idname); +} + +static const char * +idname_lookup(struct idname_tree *tree, u_int id) +{ + struct idname idname, *found; + + memset(&idname, 0, sizeof(idname)); + idname.id = id; + if ((found = RB_FIND(idname_tree, tree, &idname)) != NULL) + return found->name; + return NULL; +} + +static void +freenames(char **names, u_int nnames) +{ + u_int i; + + if (names == NULL) + return; + for (i = 0; i < nnames; i++) + free(names[i]); + free(names); +} + +static void +lookup_and_record(struct sftp_conn *conn, + u_int *uids, u_int nuids, u_int *gids, u_int ngids) +{ + int r; + u_int i; + char **usernames = NULL, **groupnames = NULL; + + if ((r = do_get_users_groups_by_id(conn, uids, nuids, gids, ngids, + &usernames, &groupnames)) != 0) { + debug_fr(r, "do_get_users_groups_by_id"); + return; + } + for (i = 0; i < nuids; i++) { + if (usernames[i] == NULL) { + debug3_f("uid %u not resolved", uids[i]); + continue; + } + debug3_f("record uid %u => \"%s\"", uids[i], usernames[i]); + idname_enter(&user_idname, uids[i], usernames[i]); + } + for (i = 0; i < ngids; i++) { + if (groupnames[i] == NULL) { + debug3_f("gid %u not resolved", gids[i]); + continue; + } + debug3_f("record gid %u => \"%s\"", gids[i], groupnames[i]); + idname_enter(&group_idname, gids[i], groupnames[i]); + } + freenames(usernames, nuids); + freenames(groupnames, ngids); +} + +static int +has_id(u_int id, u_int *ids, u_int nids) +{ + u_int i; + + if (nids == 0) + return 0; + + /* XXX O(N^2) */ + for (i = 0; i < nids; i++) { + if (ids[i] == id) + break; + } + return i < nids; +} + +static void +collect_ids_from_glob(glob_t *g, int user, u_int **idsp, u_int *nidsp) +{ + u_int id, i, n = 0, *ids = NULL; + + for (i = 0; g->gl_pathv[i] != NULL; i++) { + if (user) { + if (ruser_name(g->gl_statv[i]->st_uid) != NULL) + continue; /* Already seen */ + id = (u_int)g->gl_statv[i]->st_uid; + } else { + if (rgroup_name(g->gl_statv[i]->st_gid) != NULL) + continue; /* Already seen */ + id = (u_int)g->gl_statv[i]->st_gid; + } + if (has_id(id, ids, n)) + continue; + ids = xrecallocarray(ids, n, n + 1, sizeof(*ids)); + ids[n++] = id; + } + *idsp = ids; + *nidsp = n; +} + +void +get_remote_user_groups_from_glob(struct sftp_conn *conn, glob_t *g) +{ + u_int *uids = NULL, nuids = 0, *gids = NULL, ngids = 0; + + if (!can_get_users_groups_by_id(conn)) + return; + + collect_ids_from_glob(g, 1, &uids, &nuids); + collect_ids_from_glob(g, 0, &gids, &ngids); + lookup_and_record(conn, uids, nuids, gids, ngids); + free(uids); + free(gids); +} + +static void +collect_ids_from_dirents(SFTP_DIRENT **d, int user, u_int **idsp, u_int *nidsp) +{ + u_int id, i, n = 0, *ids = NULL; + + for (i = 0; d[i] != NULL; i++) { + if (user) { + if (ruser_name((uid_t)(d[i]->a.uid)) != NULL) + continue; /* Already seen */ + id = d[i]->a.uid; + } else { + if (rgroup_name((gid_t)(d[i]->a.gid)) != NULL) + continue; /* Already seen */ + id = d[i]->a.gid; + } + if (has_id(id, ids, n)) + continue; + ids = xrecallocarray(ids, n, n + 1, sizeof(*ids)); + ids[n++] = id; + } + *idsp = ids; + *nidsp = n; +} + +void +get_remote_user_groups_from_dirents(struct sftp_conn *conn, SFTP_DIRENT **d) +{ + u_int *uids = NULL, nuids = 0, *gids = NULL, ngids = 0; + + if (!can_get_users_groups_by_id(conn)) + return; + + collect_ids_from_dirents(d, 1, &uids, &nuids); + collect_ids_from_dirents(d, 0, &gids, &ngids); + lookup_and_record(conn, uids, nuids, gids, ngids); + free(uids); + free(gids); +} + +const char * +ruser_name(uid_t uid) +{ + return idname_lookup(&user_idname, (u_int)uid); +} + +const char * +rgroup_name(uid_t gid) +{ + return idname_lookup(&group_idname, (u_int)gid); +} + diff --git a/sftp-usergroup.h b/sftp-usergroup.h new file mode 100644 index 000000000..2711faf3a --- /dev/null +++ b/sftp-usergroup.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2022 Damien Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* sftp client user/group lookup and caching */ + +/* Lookup uids/gids and populate cache */ +void get_remote_user_groups_from_glob(struct sftp_conn *conn, glob_t *g); +void get_remote_user_groups_from_dirents(struct sftp_conn *conn, SFTP_DIRENT **d); + +/* Return user/group name from cache or NULL if not found */ +const char *ruser_name(uid_t uid); +const char *rgroup_name(uid_t gid); diff --git a/sftp.c b/sftp.c index 2d1186ac2..c3c347e08 100644 --- a/sftp.c +++ b/sftp.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sftp.c,v 1.221 2022/09/19 10:41:58 djm Exp $ */ +/* $OpenBSD: sftp.c,v 1.222 2022/09/19 10:46:00 djm Exp $ */ /* * Copyright (c) 2001-2004 Damien Miller * @@ -68,6 +68,7 @@ typedef void EditLine; #include "sshbuf.h" #include "sftp-common.h" #include "sftp-client.h" +#include "sftp-usergroup.h" /* File to read commands from */ FILE* infile; @@ -871,6 +872,7 @@ do_ls_dir(struct sftp_conn *conn, const char *path, qsort(d, n, sizeof(*d), sdirent_comp); } + get_remote_user_groups_from_dirents(conn, d); for (n = 0; d[n] != NULL && !interrupted; n++) { char *tmp, *fname; @@ -882,14 +884,17 @@ do_ls_dir(struct sftp_conn *conn, const char *path, free(tmp); if (lflag & LS_LONG_VIEW) { - if (lflag & (LS_NUMERIC_VIEW|LS_SI_UNITS)) { + if ((lflag & (LS_NUMERIC_VIEW|LS_SI_UNITS)) != 0 || + can_get_users_groups_by_id(conn)) { char *lname; struct stat sb; memset(&sb, 0, sizeof(sb)); attrib_to_stat(&d[n]->a, &sb); lname = ls_file(fname, &sb, 1, - (lflag & LS_SI_UNITS), NULL, NULL); + (lflag & LS_SI_UNITS), + ruser_name(sb.st_uid), + rgroup_name(sb.st_gid)); mprintf("%s\n", lname); free(lname); } else @@ -1017,6 +1022,7 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, sort_glob = NULL; } + get_remote_user_groups_from_glob(conn, &g); for (j = 0; j < nentries && !interrupted; j++) { i = indices[j]; fname = path_strip(g.gl_pathv[i], strip_path); @@ -1026,7 +1032,9 @@ do_globbed_ls(struct sftp_conn *conn, const char *path, continue; } lname = ls_file(fname, g.gl_statv[i], 1, - (lflag & LS_SI_UNITS), NULL, NULL); + (lflag & LS_SI_UNITS), + ruser_name(g.gl_statv[i]->st_uid), + rgroup_name(g.gl_statv[i]->st_gid)); mprintf("%s\n", lname); free(lname); } else { From 03d94a47207d58b3db37eba4f87eb6ae5a63168a Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 19 Sep 2022 20:59:04 +1000 Subject: [PATCH 259/287] avoid Wuninitialized false positive in gcc-12ish --- channels.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/channels.c b/channels.c index 6a78de9d5..e75a0cf9b 100644 --- a/channels.c +++ b/channels.c @@ -369,7 +369,7 @@ channel_new(struct ssh *ssh, char *ctype, int type, int rfd, int wfd, int efd, int nonblock) { struct ssh_channels *sc = ssh->chanctxt; - u_int i, found; + u_int i, found = 0; Channel *c; int r; From 5f954929e9f173dd1e279e07d0e8b14fa845814d Mon Sep 17 00:00:00 2001 From: Damien Miller Date: Mon, 19 Sep 2022 20:59:34 +1000 Subject: [PATCH 260/287] no need for glob.h here it also causes portability problems --- sftp-usergroup.c | 1 - 1 file changed, 1 deletion(-) diff --git a/sftp-usergroup.c b/sftp-usergroup.c index fa06fd0ac..083930a4a 100644 --- a/sftp-usergroup.c +++ b/sftp-usergroup.c @@ -21,7 +21,6 @@ #include #include -#include #include #include #include From bb847f99bca6d326ed889ad9b10efb5522d69a25 Mon Sep 17 00:00:00 2001 From: Tess Gauthier Date: Tue, 20 Sep 2022 13:40:48 -0400 Subject: [PATCH 261/287] add debug on appveyor --- appveyor.yml | 1 + regress/pesterTests/SCP.Tests.ps1 | 3 +++ 2 files changed, 4 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 990da0d72..abc4734c7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,6 +13,7 @@ build_script: after_build: - ps: | + $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppveyorHelper.psm1 Install-OpenSSH diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 928f2a106..3b01a8f2e 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -183,6 +183,9 @@ Describe "Tests for scp command" -Tags "CI" { if($Options.contains("-p ")) { + # TODO: Test only + Write-Verbose -Verbose "Source File LastWriteTime: $((Get-ChildItem -Path $SourceFilePath).LastWriteTime.DateTime)" + Write-Verbose -Verbose "Dest File LastWriteTime: $((Get-ChildItem -Path $DestinationFilePath).LastWriteTime.DateTime)" $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath).LastWriteTime.DateTime (Get-ChildItem -path $DestinationFilePath).LastWriteTime.DateTime ).Length -eq 0 $equal | Should Be $true } From d215e7333faff65d8ef1ed6990ffc544074686e7 Mon Sep 17 00:00:00 2001 From: Tess Gauthier Date: Wed, 21 Sep 2022 13:09:53 -0400 Subject: [PATCH 262/287] add sleep to pester test --- regress/pesterTests/SCP.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 3b01a8f2e..c27f346a1 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -172,7 +172,7 @@ Describe "Tests for scp command" -Tags "CI" { It 'File copy: ' -TestCases:$testData { param([string]$Title, $Source, $Destination, [string]$Options) - + Start-Sleep -Seconds 60 iex "scp $Options $Source $Destination" $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. From 8179fed3264d5919899900ed8881d5f9bb57ca33 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" <djm@openbsd.org> Date: Mon, 19 Sep 2022 21:39:16 +0000 Subject: [PATCH 263/287] upstream: add RequiredRSASize to the list of keywords accepted by -o; spotted by jmc@ OpenBSD-Commit-ID: fe871408cf6f9d3699afeda876f8adbac86a035e --- scp.1 | 5 +++-- sftp.1 | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/scp.1 b/scp.1 index 2e96e2011..cd23f9795 100644 --- a/scp.1 +++ b/scp.1 @@ -8,9 +8,9 @@ .\" .\" Created: Sun May 7 00:14:37 1995 ylo .\" -.\" $OpenBSD: scp.1,v 1.109 2022/04/16 00:22:31 tj Exp $ +.\" $OpenBSD: scp.1,v 1.110 2022/09/19 21:39:16 djm Exp $ .\" -.Dd $Mdocdate: April 16 2022 $ +.Dd $Mdocdate: September 19 2022 $ .Dt SCP 1 .Os .Sh NAME @@ -212,6 +212,7 @@ For full details of the options listed below, and their possible values, see .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication .It RekeyLimit +.It RequiredRSASize .It SendEnv .It ServerAliveInterval .It ServerAliveCountMax diff --git a/sftp.1 b/sftp.1 index 583a0ee1f..3b3f2c5a7 100644 --- a/sftp.1 +++ b/sftp.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: sftp.1,v 1.141 2022/06/27 21:41:55 djm Exp $ +.\" $OpenBSD: sftp.1,v 1.142 2022/09/19 21:39:16 djm Exp $ .\" .\" Copyright (c) 2001 Damien Miller. All rights reserved. .\" @@ -22,7 +22,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 27 2022 $ +.Dd $Mdocdate: September 19 2022 $ .Dt SFTP 1 .Os .Sh NAME @@ -273,6 +273,7 @@ For full details of the options listed below, and their possible values, see .It PubkeyAcceptedAlgorithms .It PubkeyAuthentication .It RekeyLimit +.It RequiredRSASize .It SendEnv .It ServerAliveInterval .It ServerAliveCountMax From 4cf8d0c0f3030f594a238bab21a0695735515487 Mon Sep 17 00:00:00 2001 From: "dtucker@openbsd.org" <dtucker@openbsd.org> Date: Wed, 21 Sep 2022 22:26:50 +0000 Subject: [PATCH 264/287] upstream: Fix typo. From AlexanderStohr via github PR#343. OpenBSD-Commit-ID: a134c9b4039e48803fc6a87f955b0f4a03181497 --- PROTOCOL.agent | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PROTOCOL.agent b/PROTOCOL.agent index ec2c47b63..dba76b0c0 100644 --- a/PROTOCOL.agent +++ b/PROTOCOL.agent @@ -54,7 +54,7 @@ Where a constraint consists of: string to_hostname keyspec[] to_hostkeys -An a keyspec consists of: +And a keyspec consists of: string keyblob bool is_ca @@ -81,4 +81,4 @@ the constraint is: This option is only valid for XMSS keys. -$OpenBSD: PROTOCOL.agent,v 1.17 2022/05/09 08:25:27 dtucker Exp $ +$OpenBSD: PROTOCOL.agent,v 1.18 2022/09/21 22:26:50 dtucker Exp $ From b51f3f172d87cbdb80ca4eb7b2149e56a7647557 Mon Sep 17 00:00:00 2001 From: "djm@openbsd.org" <djm@openbsd.org> Date: Mon, 26 Sep 2022 22:18:40 +0000 Subject: [PATCH 265/287] upstream: openssh-9.1 OpenBSD-Commit-ID: 5a467b2ee81da01a86adf1ad93b62b1728494e56 --- version.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/version.h b/version.h index e600fe4c3..1a034c838 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ -/* $OpenBSD: version.h,v 1.94 2022/04/04 22:45:25 djm Exp $ */ +/* $OpenBSD: version.h,v 1.95 2022/09/26 22:18:40 djm Exp $ */ -#define SSH_VERSION "OpenSSH_9.0" +#define SSH_VERSION "OpenSSH_9.1" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE From f059da2b29840c0f048448809c317ce2ae014da7 Mon Sep 17 00:00:00 2001 From: Damien Miller <djm@mindrot.org> Date: Tue, 4 Oct 2022 01:45:41 +1100 Subject: [PATCH 266/287] crank versions in RPM spec files --- contrib/redhat/openssh.spec | 2 +- contrib/suse/openssh.spec | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec index b8ba8bae0..124afccd1 100644 --- a/contrib/redhat/openssh.spec +++ b/contrib/redhat/openssh.spec @@ -1,4 +1,4 @@ -%global ver 9.0p1 +%global ver 9.1p1 %global rel 1%{?dist} # OpenSSH privilege separation requires a user & group ID diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec index 28b9086f4..32bd8c189 100644 --- a/contrib/suse/openssh.spec +++ b/contrib/suse/openssh.spec @@ -13,7 +13,7 @@ Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation Name: openssh -Version: 9.0p1 +Version: 9.1p1 URL: https://www.openssh.com/ Release: 1 Source0: openssh-%{version}.tar.gz From 657e676ff696c7bb787bffb0e249ea1be3b474e1 Mon Sep 17 00:00:00 2001 From: Damien Miller <djm@mindrot.org> Date: Tue, 4 Oct 2022 01:45:52 +1100 Subject: [PATCH 267/287] update release notes URL --- README | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README b/README index 70a8f814c..0d3416f57 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -See https://www.openssh.com/releasenotes.html#9.0p1 for the release notes. +See https://www.openssh.com/releasenotes.html#9.1p1 for the release notes. Please read https://www.openssh.com/report.html for bug reporting instructions and note that we do not use Github for bug reporting or From 0ffb46f2ee2ffcc4daf45ee679e484da8fcf338c Mon Sep 17 00:00:00 2001 From: Damien Miller <djm@mindrot.org> Date: Tue, 4 Oct 2022 01:51:42 +1100 Subject: [PATCH 268/287] update .depend --- .depend | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.depend b/.depend index 0661aba3d..fca83a67c 100644 --- a/.depend +++ b/.depend @@ -27,6 +27,7 @@ auth2-none.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-co auth2-passwd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h packet.h openbsd-compat/sys-queue.h dispatch.h ssherr.h log.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h monitor_wrap.h misc.h servconf.h auth2-pubkey.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h kex.h mac.h crypto_api.h sshbuf.h log.h ssherr.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth2-pubkey.o: pathnames.h uidswap.h auth-options.h canohost.h monitor_wrap.h authfile.h match.h channels.h session.h sk-api.h +auth2-pubkeyfile.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssh.h log.h ssherr.h misc.h compat.h sshkey.h digest.h hostfile.h auth.h auth-pam.h audit.h loginrec.h auth-options.h authfile.h match.h auth2.o: digest.h auth2.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h ssh2.h packet.h openbsd-compat/sys-queue.h dispatch.h log.h ssherr.h sshbuf.h misc.h servconf.h compat.h sshkey.h hostfile.h auth.h auth-pam.h audit.h loginrec.h pathnames.h monitor_wrap.h authfd.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h ssh.h sshbuf.h sshkey.h authfd.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h compat.h log.h ssherr.h atomicio.h misc.h @@ -121,7 +122,8 @@ sftp-glob.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-com sftp-realpath.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sftp-server-main.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h sftp.h misc.h xmalloc.h sftp-server.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h atomicio.h xmalloc.h sshbuf.h ssherr.h log.h misc.h match.h uidswap.h sftp.h sftp-common.h -sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h pathnames.h misc.h utf8.h sftp.h sshbuf.h sftp-common.h sftp-client.h openbsd-compat/glob.h +sftp-usergroup.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h log.h ssherr.h xmalloc.h sftp-common.h sftp-client.h openbsd-compat/glob.h sftp-usergroup.h +sftp.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h log.h ssherr.h pathnames.h misc.h utf8.h sftp.h sshbuf.h sftp-common.h sftp-client.h openbsd-compat/glob.h sftp-usergroup.h sk-usbhid.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sntrup761.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h srclimit.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h addr.h canohost.h log.h ssherr.h misc.h srclimit.h xmalloc.h From 3e3b11048584465fd9ecabf7fbdaf5a1bb12a55f Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 6 Oct 2022 15:43:21 -0400 Subject: [PATCH 269/287] fix 9.1 compilation errors --- auth.h | 4 ++++ contrib/win32/openssh/libssh.vcxproj | 1 - contrib/win32/openssh/libssh.vcxproj.filters | 1 - contrib/win32/openssh/scp.vcxproj | 1 + contrib/win32/openssh/scp.vcxproj.filters | 3 +++ contrib/win32/openssh/sftp.vcxproj | 1 + contrib/win32/openssh/sftp.vcxproj.filters | 5 ++++- contrib/win32/openssh/ssh.vcxproj | 2 ++ contrib/win32/openssh/ssh.vcxproj.filters | 6 ++++++ contrib/win32/openssh/sshd.vcxproj | 3 +++ contrib/win32/openssh/sshd.vcxproj.filters | 9 +++++++++ sftp-server.c | 4 ++++ sk-usbhid.c | 4 ++-- 13 files changed, 39 insertions(+), 5 deletions(-) diff --git a/auth.h b/auth.h index 6d2d39762..59b6b6f5e 100644 --- a/auth.h +++ b/auth.h @@ -41,6 +41,10 @@ #include <krb5.h> #endif +#ifdef WINDOWS +#include "hostfile.h" +#endif + struct passwd; struct ssh; struct sshbuf; diff --git a/contrib/win32/openssh/libssh.vcxproj b/contrib/win32/openssh/libssh.vcxproj index 6b164c77a..e15f7dcb8 100644 --- a/contrib/win32/openssh/libssh.vcxproj +++ b/contrib/win32/openssh/libssh.vcxproj @@ -356,7 +356,6 @@ <ClCompile Include="$(OpenSSH-Src-Path)cipher-aes.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher-aesctr.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher-chachapoly.c" /> - <ClCompile Include="$(OpenSSH-Src-Path)cipher-ctr.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cleanup.c" /> <ClCompile Include="$(OpenSSH-Src-Path)compat.c" /> diff --git a/contrib/win32/openssh/libssh.vcxproj.filters b/contrib/win32/openssh/libssh.vcxproj.filters index 6f00d47f3..b5acd1500 100644 --- a/contrib/win32/openssh/libssh.vcxproj.filters +++ b/contrib/win32/openssh/libssh.vcxproj.filters @@ -12,7 +12,6 @@ <ClCompile Include="$(OpenSSH-Src-Path)cipher-aes.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher-aesctr.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher-chachapoly.c" /> - <ClCompile Include="$(OpenSSH-Src-Path)cipher-ctr.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cipher.c" /> <ClCompile Include="$(OpenSSH-Src-Path)cleanup.c" /> <ClCompile Include="$(OpenSSH-Src-Path)compat.c" /> diff --git a/contrib/win32/openssh/scp.vcxproj b/contrib/win32/openssh/scp.vcxproj index 6fac57aad..d04f523a3 100644 --- a/contrib/win32/openssh/scp.vcxproj +++ b/contrib/win32/openssh/scp.vcxproj @@ -42,6 +42,7 @@ <ClCompile Include="..\..\..\sftp-client.c" /> <ClCompile Include="..\..\..\sftp-common.c" /> <ClCompile Include="..\..\..\sftp-glob.c" /> + <ClCompile Include="..\..\..\sftp-usergroup.c" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc" /> diff --git a/contrib/win32/openssh/scp.vcxproj.filters b/contrib/win32/openssh/scp.vcxproj.filters index b184c7e44..981ec179d 100644 --- a/contrib/win32/openssh/scp.vcxproj.filters +++ b/contrib/win32/openssh/scp.vcxproj.filters @@ -33,6 +33,9 @@ <ClCompile Include="..\..\..\sftp-glob.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\..\sftp-usergroup.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc"> diff --git a/contrib/win32/openssh/sftp.vcxproj b/contrib/win32/openssh/sftp.vcxproj index 6636a11ec..5ac815805 100644 --- a/contrib/win32/openssh/sftp.vcxproj +++ b/contrib/win32/openssh/sftp.vcxproj @@ -43,6 +43,7 @@ <ClCompile Include="$(OpenSSH-Src-Path)sftp.c" /> <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\wmain_common.c" /> <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\win32-utf8.c" /> + <ClCompile Include="..\..\..\sftp-usergroup.c" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc" /> diff --git a/contrib/win32/openssh/sftp.vcxproj.filters b/contrib/win32/openssh/sftp.vcxproj.filters index 60da32cc3..ec3e9cd0d 100644 --- a/contrib/win32/openssh/sftp.vcxproj.filters +++ b/contrib/win32/openssh/sftp.vcxproj.filters @@ -36,10 +36,13 @@ <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\win32-utf8.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\..\sftp-usergroup.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc"> <Filter>Resource Files</Filter> </ResourceCompile> </ItemGroup> -</Project> +</Project> \ No newline at end of file diff --git a/contrib/win32/openssh/ssh.vcxproj b/contrib/win32/openssh/ssh.vcxproj index 1ab0e971c..016ed316e 100644 --- a/contrib/win32/openssh/ssh.vcxproj +++ b/contrib/win32/openssh/ssh.vcxproj @@ -507,6 +507,8 @@ <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\win32_sshtty.c" /> <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\win32-utf8.c" /> <ClCompile Include="$(OpenSSH-Src-Path)ssh-sk-client.c" /> + <ClCompile Include="..\..\..\misc.c" /> + <ClCompile Include="..\..\..\sshkey.c" /> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc" /> diff --git a/contrib/win32/openssh/ssh.vcxproj.filters b/contrib/win32/openssh/ssh.vcxproj.filters index a6aed6932..7720669d4 100644 --- a/contrib/win32/openssh/ssh.vcxproj.filters +++ b/contrib/win32/openssh/ssh.vcxproj.filters @@ -314,6 +314,12 @@ <ClCompile Include="$(OpenSSH-Src-Path)ssh-sk-client.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\..\misc.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\sshkey.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc"> diff --git a/contrib/win32/openssh/sshd.vcxproj b/contrib/win32/openssh/sshd.vcxproj index 274f8c23b..83a9cda91 100644 --- a/contrib/win32/openssh/sshd.vcxproj +++ b/contrib/win32/openssh/sshd.vcxproj @@ -459,8 +459,11 @@ <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\win32_sshpty.c" /> <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\wmain_sshd.c" /> <ClCompile Include="$(OpenSSH-Src-Path)contrib\win32\win32compat\w32-doexec.c" /> + <ClCompile Include="..\..\..\auth2-pubkeyfile.c" /> + <ClCompile Include="..\..\..\misc.c" /> <ClCompile Include="..\..\..\srclimit.c" /> <ClCompile Include="..\..\..\ssh-sk-client.c" /> + <ClCompile Include="..\..\..\sshkey.c" /> <ClCompile Include="..\win32compat\win32-utf8.c" /> </ItemGroup> <ItemGroup> diff --git a/contrib/win32/openssh/sshd.vcxproj.filters b/contrib/win32/openssh/sshd.vcxproj.filters index 97055c7b5..1563e5437 100644 --- a/contrib/win32/openssh/sshd.vcxproj.filters +++ b/contrib/win32/openssh/sshd.vcxproj.filters @@ -150,6 +150,15 @@ <ClCompile Include="..\..\..\ssh-sk-client.c"> <Filter>Source Files</Filter> </ClCompile> + <ClCompile Include="..\..\..\auth2-pubkeyfile.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\misc.c"> + <Filter>Source Files</Filter> + </ClCompile> + <ClCompile Include="..\..\..\sshkey.c"> + <Filter>Source Files</Filter> + </ClCompile> </ItemGroup> <ItemGroup> <ResourceCompile Include="version.rc"> diff --git a/sftp-server.c b/sftp-server.c index 7654c1915..14b7b8db6 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -181,8 +181,10 @@ static const struct sftp_handler extended_handlers[] = { { "copy-data", "copy-data", 0, process_extended_copy_data, 1 }, { "home-directory", "home-directory", 0, process_extended_home_directory, 0 }, +#ifndef WINDOWS { "users-groups-by-id", "users-groups-by-id@openssh.com", 0, process_extended_get_users_groups_by_id, 0 }, +#endif { NULL, NULL, 0, NULL, 0 } }; @@ -1759,6 +1761,7 @@ process_extended_home_directory(u_int32_t id) static void process_extended_get_users_groups_by_id(u_int32_t id) { +#ifndef WINDOWS struct passwd *user_pw; struct group *gr; struct sshbuf *uids, *gids, *usernames, *groupnames, *msg; @@ -1809,6 +1812,7 @@ process_extended_get_users_groups_by_id(u_int32_t id) sshbuf_free(usernames); sshbuf_free(groupnames); sshbuf_free(msg); +#endif } static void diff --git a/sk-usbhid.c b/sk-usbhid.c index 083d38c8f..edc16a87d 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -1208,10 +1208,10 @@ sk_sign(uint32_t alg, const uint8_t *data, size_t datalen, if ((sk = sk_open("windows://hello")) == NULL) { if (pin != NULL || (flags & SSH_SK_USER_VERIFICATION_REQD)) - sk = sk_probe(NULL, NULL, 0); + sk = sk_probe(NULL, NULL, 0, 0); else sk = sk_probe(application, key_handle, - key_handle_len); + key_handle_len, 0); } } #else From 43bbf692c6adc5c1b40483e2cfe72b1edeccf0f0 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 6 Oct 2022 15:47:12 -0400 Subject: [PATCH 270/287] disable -p pester tests due to unreliability on older Windows versions --- regress/pesterTests/SCP.Tests.ps1 | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index c27f346a1..27c1a7e7c 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -52,13 +52,7 @@ Describe "Tests for scp command" -Tags "CI" { Source = $SourceFilePath Destination = "test_target:$DestinationFilePath" Options = "-S `"$sshcmd`"" - }, - @{ - Title = 'Simple copy remote file to local file' - Source = "test_target:$SourceFilePath" - Destination = $DestinationFilePath - Options = "-p -c aes128-ctr -C" - }, + }, @{ Title = 'Simple copy local file to local dir' Source = $SourceFilePath From 2653b08c595a314cc2a9b81eae797891a5644efd Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Fri, 7 Oct 2022 12:45:46 -0400 Subject: [PATCH 271/287] remove extra sleep time from debugging scp pester tests --- regress/pesterTests/SCP.Tests.ps1 | 1 - 1 file changed, 1 deletion(-) diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 27c1a7e7c..041ba4569 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -166,7 +166,6 @@ Describe "Tests for scp command" -Tags "CI" { It 'File copy: <Title> ' -TestCases:$testData { param([string]$Title, $Source, $Destination, [string]$Options) - Start-Sleep -Seconds 60 iex "scp $Options $Source $Destination" $LASTEXITCODE | Should Be 0 #validate file content. DestPath is the path to the file. From 5e2b081a49d2201ef5eb3d4305faa930e77538b2 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Tue, 11 Oct 2022 18:40:39 -0400 Subject: [PATCH 272/287] modify -p tests to only run for Windows OS version 10 and above --- regress/pesterTests/SCP.Tests.ps1 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 041ba4569..20fcbf515 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -52,7 +52,13 @@ Describe "Tests for scp command" -Tags "CI" { Source = $SourceFilePath Destination = "test_target:$DestinationFilePath" Options = "-S `"$sshcmd`"" - }, + }, + @{ + Title = 'Simple copy remote file to local file' + Source = "test_target:$SourceFilePath" + Destination = $DestinationFilePath + Options = "-p -c aes128-ctr -C" + }, @{ Title = 'Simple copy local file to local dir' Source = $SourceFilePath @@ -174,11 +180,8 @@ Describe "Tests for scp command" -Tags "CI" { $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length ).Length -eq 0 $equal | Should Be $true - if($Options.contains("-p ")) + if($Options.contains("-p ") -and [System.Convert]::ToInt32((Get-WMIObject win32_operatingsystem).Version.Split(".")[0]) -ge 10) { - # TODO: Test only - Write-Verbose -Verbose "Source File LastWriteTime: $((Get-ChildItem -Path $SourceFilePath).LastWriteTime.DateTime)" - Write-Verbose -Verbose "Dest File LastWriteTime: $((Get-ChildItem -Path $DestinationFilePath).LastWriteTime.DateTime)" $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath).LastWriteTime.DateTime (Get-ChildItem -path $DestinationFilePath).LastWriteTime.DateTime ).Length -eq 0 $equal | Should Be $true } From 9b344f44667cbba7ce93f5a99fc5d691472ad288 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 12 Oct 2022 11:55:55 -0400 Subject: [PATCH 273/287] add windows specific code back into method moved from auth.c to auth2-pubkeyfile.c --- auth2-pubkeyfile.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c index 0cfacac35..f7d262a17 100644 --- a/auth2-pubkeyfile.c +++ b/auth2-pubkeyfile.c @@ -448,6 +448,23 @@ auth_openfile(const char *file, struct passwd *pw, int strict_modes, int fd; FILE *f; +#ifdef WINDOWS + /* Windows POSIX adapter does not support fdopen() on open(file)*/ + if ((f = fopen(file, "r")) == NULL) { + debug("Could not open %s '%s': %s", file_type, file, + strerror(errno)); + return NULL; + } + + // read permissions for non-admin/non-system accounts are allowed. + // Unix does safe_path_fd() which allows 022 file permissions i.e., allowing read for other users. + if (strict_modes && check_secure_file_permission(file, pw, 1) != 0) { + fclose(f); + logit("Authentication refused."); + auth_debug_add("Ignored %s", file_type); + return NULL; + } +#else /* !WINDOWS */ if ((fd = open(file, O_RDONLY|O_NONBLOCK)) == -1) { if (errno != ENOENT) { logit("Could not open user '%s' %s '%s': %s", @@ -481,6 +498,7 @@ auth_openfile(const char *file, struct passwd *pw, int strict_modes, auth_debug_add("Ignored %s: %s", file_type, line); return NULL; } +#endif /* !WINDOWS */ return f; } From 0bde9952c75d2e6d5500c9312f60c80bb25acb81 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 13 Oct 2022 11:04:47 -0400 Subject: [PATCH 274/287] add preprocessor for WinHello --- contrib/win32/openssh/config.h.vs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contrib/win32/openssh/config.h.vs b/contrib/win32/openssh/config.h.vs index 976d7f107..52606932e 100644 --- a/contrib/win32/openssh/config.h.vs +++ b/contrib/win32/openssh/config.h.vs @@ -1734,3 +1734,5 @@ #define _PATH_TTY "conin$" #define HAVE_STRUCT_POLLFD_FD 1 #define HAVE_KILLPG 1 +#define HAVE_FIDO_DEV_IS_WINHELLO + From eb2f6238fb424dc5709298df5585a0cd1fbb63d7 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 13 Oct 2022 12:35:46 -0400 Subject: [PATCH 275/287] revert preprocessor definition for winhello --- contrib/win32/openssh/config.h.vs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/win32/openssh/config.h.vs b/contrib/win32/openssh/config.h.vs index 52606932e..2227c1833 100644 --- a/contrib/win32/openssh/config.h.vs +++ b/contrib/win32/openssh/config.h.vs @@ -1734,5 +1734,5 @@ #define _PATH_TTY "conin$" #define HAVE_STRUCT_POLLFD_FD 1 #define HAVE_KILLPG 1 -#define HAVE_FIDO_DEV_IS_WINHELLO + From 302dc2f2b4a2c3d71bc01a002d7be522d24eed11 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 13 Oct 2022 12:36:04 -0400 Subject: [PATCH 276/287] add windows preprocessor definition in key_lookup --- sk-usbhid.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sk-usbhid.c b/sk-usbhid.c index edc16a87d..2dda5e50c 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -791,11 +791,12 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, skdebug(__func__, "fido_assert_new failed"); goto out; } + /* generate an invalid signature on FIDO2 tokens */ if ((r = fido_assert_set_clientdata(assert, message, - sizeof(message))) != FIDO_OK) { + sizeof(message))) != FIDO_OK) { skdebug(__func__, "fido_assert_set_clientdata: %s", - fido_strerr(r)); + fido_strerr(r)); goto out; } if ((r = fido_assert_set_rp(assert, application)) != FIDO_OK) { @@ -814,10 +815,12 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, skdebug(__func__, "fido_assert_set_uv: %s", fido_strerr(r)); goto out; } +#ifndef WINDOWS if ((r = fido_dev_get_assert(dev, assert, pin)) != FIDO_OK) { skdebug(__func__, "fido_dev_get_assert: %s", fido_strerr(r)); goto out; } +#endif r = FIDO_ERR_NO_CREDENTIALS; skdebug(__func__, "%zu signatures returned", fido_assert_count(assert)); for (i = 0; i < fido_assert_count(assert); i++) { From 0488165b5e3a65d44e771185d7528eec8ad6b56e Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 13 Oct 2022 12:57:31 -0400 Subject: [PATCH 277/287] remove rdp block from appveyor since we are no longer debugging --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index abc4734c7..990da0d72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,6 @@ build_script: after_build: - ps: | - $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppveyorHelper.psm1 Install-OpenSSH From ca9f04bd949a248ecf5dfd37c78719d654d32e7f Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 13 Oct 2022 15:51:05 -0400 Subject: [PATCH 278/287] add ifdef to sftp-server.c --- regress/pesterTests/CertAuth.Tests.ps1 | 2 +- sftp-server.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/regress/pesterTests/CertAuth.Tests.ps1 b/regress/pesterTests/CertAuth.Tests.ps1 index 2e6a8e216..cb822ca95 100644 --- a/regress/pesterTests/CertAuth.Tests.ps1 +++ b/regress/pesterTests/CertAuth.Tests.ps1 @@ -79,7 +79,7 @@ Describe "E2E scenarios for certificate authentication" -Tags "CI" { #set up SSH_ASKPASS for key passphrase Add-PasswordSetting -Pass $keypassphrase - $o = ssh -i $user_key -p 47004 $pkuser@$server echo 2345 + $o = ssh -vvv -i $user_key -p 47004 $pkuser@$server echo 2345 Remove-PasswordSetting Stop-SSHDTestDaemon -Port 47004 diff --git a/sftp-server.c b/sftp-server.c index 14b7b8db6..b93a2980b 100644 --- a/sftp-server.c +++ b/sftp-server.c @@ -745,8 +745,9 @@ process_init(void) compose_extension(msg, "expand-path@openssh.com", "1"); compose_extension(msg, "copy-data", "1"); compose_extension(msg, "home-directory", "1"); +#ifndef WINDOWS compose_extension(msg, "users-groups-by-id@openssh.com", "1"); - +#endif send_msg(msg); sshbuf_free(msg); } From 803e013b3bef3bb7d03cc45384caa648246afa0c Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Tue, 18 Oct 2022 14:04:50 -0400 Subject: [PATCH 279/287] make key_lookup compatible with winhello --- contrib/win32/openssh/config.h.vs | 2 ++ sk-usbhid.c | 16 +++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/contrib/win32/openssh/config.h.vs b/contrib/win32/openssh/config.h.vs index 2227c1833..721f62ba9 100644 --- a/contrib/win32/openssh/config.h.vs +++ b/contrib/win32/openssh/config.h.vs @@ -151,6 +151,7 @@ #define HAVE_FIDO_DEV_GET_TOUCH_STATUS #define HAVE_FIDO_CRED_SET_CLIENTDATA #define HAVE_FIDO_ASSERT_SET_CLIENTDATA +#define HAVE_FIDO_DEV_IS_WINHELLO /* File names may not contain backslash characters */ /* #undef FILESYSTEM_NO_BACKSLASH */ @@ -1736,3 +1737,4 @@ #define HAVE_KILLPG 1 + diff --git a/sk-usbhid.c b/sk-usbhid.c index 2dda5e50c..9a3960e02 100644 --- a/sk-usbhid.c +++ b/sk-usbhid.c @@ -780,7 +780,10 @@ static int key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, size_t user_id_len, const char *pin) { - fido_assert_t *assert = NULL; +#ifdef HAVE_FIDO_DEV_IS_WINHELLO + return FIDO_OK; +#else + fido_assert_t* assert = NULL; uint8_t message[32]; int r = FIDO_ERR_INTERNAL; int sk_supports_uv, uv; @@ -809,33 +812,32 @@ key_lookup(fido_dev_t *dev, const char *application, const uint8_t *user_id, } uv = FIDO_OPT_OMIT; if (pin == NULL && check_sk_options(dev, "uv", &sk_supports_uv) == 0 && - sk_supports_uv != -1) + sk_supports_uv != -1) uv = FIDO_OPT_TRUE; if ((r = fido_assert_set_uv(assert, uv)) != FIDO_OK) { skdebug(__func__, "fido_assert_set_uv: %s", fido_strerr(r)); goto out; } -#ifndef WINDOWS if ((r = fido_dev_get_assert(dev, assert, pin)) != FIDO_OK) { skdebug(__func__, "fido_dev_get_assert: %s", fido_strerr(r)); goto out; } -#endif r = FIDO_ERR_NO_CREDENTIALS; skdebug(__func__, "%zu signatures returned", fido_assert_count(assert)); for (i = 0; i < fido_assert_count(assert); i++) { if (fido_assert_user_id_len(assert, i) == user_id_len && - memcmp(fido_assert_user_id_ptr(assert, i), user_id, - user_id_len) == 0) { + memcmp(fido_assert_user_id_ptr(assert, i), user_id, + user_id_len) == 0) { skdebug(__func__, "credential exists"); r = FIDO_OK; goto out; } } - out: +out: fido_assert_free(&assert); return r; +#endif /* HAVE_FIDO_DEV_IS_WINHELLO */ } int From a88ae8d841936ed9ea8ba6ffe3111b8248f53c68 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Tue, 18 Oct 2022 14:07:12 -0400 Subject: [PATCH 280/287] appveyor.yml --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 990da0d72..abc4734c7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,6 +13,7 @@ build_script: after_build: - ps: | + $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppveyorHelper.psm1 Install-OpenSSH From bbb76f5c67cd55323d0d3b950bc8d3dd8250f823 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 19 Oct 2022 14:22:39 -0400 Subject: [PATCH 281/287] increase debug of failing pester test --- regress/pesterTests/CertAuth.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/pesterTests/CertAuth.Tests.ps1 b/regress/pesterTests/CertAuth.Tests.ps1 index cb822ca95..a3c404ad9 100644 --- a/regress/pesterTests/CertAuth.Tests.ps1 +++ b/regress/pesterTests/CertAuth.Tests.ps1 @@ -70,7 +70,7 @@ Describe "E2E scenarios for certificate authentication" -Tags "CI" { $pcOutFile = Join-Path $testDir "$tC.$tI.pcout.txt" $logFile = Join-Path $testDir "$tC.$tI.log.txt" Remove-Item -Force $pcOutFile -ErrorAction SilentlyContinue - $sshdArgs = "-d -f $sshdconfig -E $logFile -o `"AuthorizedKeysFile .fake/authorized_keys`"" + $sshdArgs = "-ddd -f $sshdconfig -E $logFile -o `"AuthorizedKeysFile .fake/authorized_keys`"" $sshdArgs += " -o `"AuthorizedPrincipalsCommand=$env:windir\system32\cmd.exe /c echo otheruser& echo $pkuser& whoami > $pcOutFile`"" $sshdArgs += " -o `"AuthorizedPrincipalsCommandUser=$ssouser`"" $sshdArgs += " -o PasswordAuthentication=no" From 2116c820cadda1775e261897cdf802ea076be788 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 19 Oct 2022 15:56:48 -0400 Subject: [PATCH 282/287] add #ifdef SUPPORT_CRLF back into auth_check_principals_line method that was moved/renamed --- auth2-pubkeyfile.c | 6 ++++++ regress/pesterTests/CertAuth.Tests.ps1 | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/auth2-pubkeyfile.c b/auth2-pubkeyfile.c index f7d262a17..126823ba3 100644 --- a/auth2-pubkeyfile.c +++ b/auth2-pubkeyfile.c @@ -186,6 +186,12 @@ auth_check_principals_line(char *cp, const struct sshkey_cert *cert, while (ep > cp && (*ep == '\n' || *ep == ' ' || *ep == '\t')) *ep-- = '\0'; +#ifdef SUPPORT_CRLF + /* account for \r at line end */ + if (*ep == '\r') + *ep-- = '\0'; +#endif + /* * If the line has internal whitespace then assume it has * key options. diff --git a/regress/pesterTests/CertAuth.Tests.ps1 b/regress/pesterTests/CertAuth.Tests.ps1 index a3c404ad9..2e6a8e216 100644 --- a/regress/pesterTests/CertAuth.Tests.ps1 +++ b/regress/pesterTests/CertAuth.Tests.ps1 @@ -70,7 +70,7 @@ Describe "E2E scenarios for certificate authentication" -Tags "CI" { $pcOutFile = Join-Path $testDir "$tC.$tI.pcout.txt" $logFile = Join-Path $testDir "$tC.$tI.log.txt" Remove-Item -Force $pcOutFile -ErrorAction SilentlyContinue - $sshdArgs = "-ddd -f $sshdconfig -E $logFile -o `"AuthorizedKeysFile .fake/authorized_keys`"" + $sshdArgs = "-d -f $sshdconfig -E $logFile -o `"AuthorizedKeysFile .fake/authorized_keys`"" $sshdArgs += " -o `"AuthorizedPrincipalsCommand=$env:windir\system32\cmd.exe /c echo otheruser& echo $pkuser& whoami > $pcOutFile`"" $sshdArgs += " -o `"AuthorizedPrincipalsCommandUser=$ssouser`"" $sshdArgs += " -o PasswordAuthentication=no" @@ -79,7 +79,7 @@ Describe "E2E scenarios for certificate authentication" -Tags "CI" { #set up SSH_ASKPASS for key passphrase Add-PasswordSetting -Pass $keypassphrase - $o = ssh -vvv -i $user_key -p 47004 $pkuser@$server echo 2345 + $o = ssh -i $user_key -p 47004 $pkuser@$server echo 2345 Remove-PasswordSetting Stop-SSHDTestDaemon -Port 47004 From 691218cd2dbdbce367507141b3e9db94fa2b37e3 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 19 Oct 2022 16:16:17 -0400 Subject: [PATCH 283/287] modify new scp.sh tests for windows --- regress/scp.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/regress/scp.sh b/regress/scp.sh index 413db5943..6f8bed200 100644 --- a/regress/scp.sh +++ b/regress/scp.sh @@ -62,26 +62,26 @@ for mode in scp sftp ; do verbose "$tag: copy local file to remote file in place" scpclean cp ${DATA} ${COPY} - $SCP $scpopts ${COPY} somehost:${COPY} || fail "copy failed" + $SCP "${scpopts[@]}" ${COPY} somehost:${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" verbose "$tag: copy remote file to local file in place" scpclean cp ${DATA} ${COPY} - $SCP $scpopts somehost:${COPY} ${COPY} || fail "copy failed" + $SCP "${scpopts[@]}" somehost:${COPY} ${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" verbose "$tag: copy local file to remote file clobber" scpclean cat ${DATA} ${DATA} > ${COPY} - $SCP $scpopts ${DATA} somehost:${COPY} || fail "copy failed" + $SCP "${scpopts[@]}" ${DATA} somehost:${COPY} || fail "copy failed" ls -l $DATA $COPY cmp ${DATA} ${COPY} || fail "corrupted copy" verbose "$tag: copy remote file to local file clobber" scpclean cat ${DATA} ${DATA} > ${COPY} - $SCP $scpopts somehost:${DATA} ${COPY} || fail "copy failed" + $SCP "${scpopts[@]}" somehost:${DATA} ${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" verbose "$tag: simple copy local file to remote dir" From 5742e1cd57d9e83d8c812b6e55edcaf06a0f2296 Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 19 Oct 2022 17:28:21 -0400 Subject: [PATCH 284/287] remove in place tests from scp.sh --- regress/scp.sh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/regress/scp.sh b/regress/scp.sh index 6f8bed200..69b7aa029 100644 --- a/regress/scp.sh +++ b/regress/scp.sh @@ -59,17 +59,19 @@ for mode in scp sftp ; do $SCP "${scpopts[@]}" somehost:${DATA} ${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" - verbose "$tag: copy local file to remote file in place" - scpclean - cp ${DATA} ${COPY} - $SCP "${scpopts[@]}" ${COPY} somehost:${COPY} || fail "copy failed" - cmp ${DATA} ${COPY} || fail "corrupted copy" + # In place tests will not work on Windows because the file being read from is the file being written to simultaneously - verbose "$tag: copy remote file to local file in place" - scpclean - cp ${DATA} ${COPY} - $SCP "${scpopts[@]}" somehost:${COPY} ${COPY} || fail "copy failed" - cmp ${DATA} ${COPY} || fail "corrupted copy" + # verbose "$tag: copy local file to remote file in place" + # scpclean + # cp ${DATA} ${COPY} + # $SCP "${scpopts[@]}" ${COPY} somehost:${COPY} || fail "copy failed" + # cmp ${DATA} ${COPY} || fail "corrupted copy" + + # verbose "$tag: copy remote file to local file in place" + # scpclean + # cp ${DATA} ${COPY} + # $SCP "${scpopts[@]}" somehost:${COPY} ${COPY} || fail "copy failed" + # cmp ${DATA} ${COPY} || fail "corrupted copy" verbose "$tag: copy local file to remote file clobber" scpclean From 67598092eb169b705bb4bb0740d574816ec3a6bd Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 19 Oct 2022 17:49:45 -0400 Subject: [PATCH 285/287] remove rdp debug from appveyor --- appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index abc4734c7..990da0d72 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,6 @@ build_script: after_build: - ps: | - $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1')) Import-Module $env:APPVEYOR_BUILD_FOLDER\contrib\win32\openssh\AppveyorHelper.psm1 Install-OpenSSH From 59a1c22f5e849110994e06bee24121d78884d83b Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Thu, 20 Oct 2022 11:46:26 -0400 Subject: [PATCH 286/287] retrigger appveyor --- regress/scp.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/scp.sh b/regress/scp.sh index 69b7aa029..e32f1c499 100644 --- a/regress/scp.sh +++ b/regress/scp.sh @@ -59,7 +59,7 @@ for mode in scp sftp ; do $SCP "${scpopts[@]}" somehost:${DATA} ${COPY} || fail "copy failed" cmp ${DATA} ${COPY} || fail "corrupted copy" - # In place tests will not work on Windows because the file being read from is the file being written to simultaneously + # In place tests will not work on Windows because of simultaneous read of/write to file # verbose "$tag: copy local file to remote file in place" # scpclean From 99afa05d1015239c76af1da9c7aa129e9fff0c1f Mon Sep 17 00:00:00 2001 From: Tess Gauthier <tgauth@bu.edu> Date: Wed, 2 Nov 2022 10:48:59 -0400 Subject: [PATCH 287/287] change check of OS version in scp test --- regress/pesterTests/SCP.Tests.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regress/pesterTests/SCP.Tests.ps1 b/regress/pesterTests/SCP.Tests.ps1 index 20fcbf515..54623c5a1 100644 --- a/regress/pesterTests/SCP.Tests.ps1 +++ b/regress/pesterTests/SCP.Tests.ps1 @@ -180,7 +180,7 @@ Describe "Tests for scp command" -Tags "CI" { $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath) (Get-ChildItem -path $DestinationFilePath) -Property Name, Length ).Length -eq 0 $equal | Should Be $true - if($Options.contains("-p ") -and [System.Convert]::ToInt32((Get-WMIObject win32_operatingsystem).Version.Split(".")[0]) -ge 10) + if($Options.contains("-p ") -and [environment]::OSVersion.Version.Major -ge 10) { $equal = @(Compare-Object (Get-ChildItem -path $SourceFilePath).LastWriteTime.DateTime (Get-ChildItem -path $DestinationFilePath).LastWriteTime.DateTime ).Length -eq 0 $equal | Should Be $true