From 2387620fa2ecf6679f083ba4c50302a47796113a Mon Sep 17 00:00:00 2001 From: aixiao Date: Sat, 7 May 2022 13:18:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AC=A1=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 16 ++ README.md | 27 +++ aes/Makefile | 16 ++ aes/aes | Bin 0 -> 54760 bytes aes/aes.c | 607 ++++++++++++++++++++++++++++++++++++++++++++++++++ aes/aes.h | 18 ++ aes/aes.o | Bin 0 -> 47816 bytes aes/main.c | 124 +++++++++++ aes/main.o | Bin 0 -> 20816 bytes main.c | 289 ++++++++++++++++++++++++ main.o | Bin 0 -> 46088 bytes remote_libssh | Bin 0 -> 40968 bytes 12 files changed, 1097 insertions(+) create mode 100644 Makefile create mode 100644 README.md create mode 100644 aes/Makefile create mode 100644 aes/aes create mode 100644 aes/aes.c create mode 100644 aes/aes.h create mode 100644 aes/aes.o create mode 100644 aes/main.c create mode 100644 aes/main.o create mode 100644 main.c create mode 100644 main.o create mode 100644 remote_libssh diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4d77de7 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +CROSS_COMPILE ?= +CC := $(CROSS_COMPILE)gcc +STRIP := $(CROSS_COMPILE)strip +CFLAGS += -g -O2 -Wall +LIBS = -lssh +OBJ := remote_libssh + +all: main.o + $(CC) $(CFLAGS) -o $(OBJ) $^ $(LIBS) +.c.o: + $(CC) $(CFLAGS) -c $< + +clean: + rm -rf *.o + rm $(OBJ) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..164acf1 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# remote_libssh + 远程执行shell命令 + 支持aes 128位加密密钥文件,写入程序中 + 支持指定未加密的密钥文件 + + +# 编译 + git clone https://git.aixiao.me/aixiao/remote_libssh + cd remote_libssh + make clean; make + cd ./aes + make clean; make + + +# Help + remote command + Author: aixiao@aixiao.me + Usage: [-?hlfpkb] + + Options: + -l : host # 主机名或Ip + -f : port # 端口 + -p : passwd # 密码(当前登录的用户名,我一般是root) + -k : private key passwd # 私钥密码 + -i : private key file # 私钥文件 + -b : command # 执行的命令 + -? -h : help information diff --git a/aes/Makefile b/aes/Makefile new file mode 100644 index 0000000..5e11fe8 --- /dev/null +++ b/aes/Makefile @@ -0,0 +1,16 @@ +CROSS_COMPILE ?= +CC := $(CROSS_COMPILE)gcc +STRIP := $(CROSS_COMPILE)strip +CFLAGS += -g -O2 +LIBS = +OBJ := aes + +all: aes.o main.o + $(CC) $(CFLAGS) -o $(OBJ) $^ $(LIBS) +.c.o: + $(CC) $(CFLAGS) -c $< + +clean: + rm -rf *.o + rm $(OBJ) + diff --git a/aes/aes b/aes/aes new file mode 100644 index 0000000000000000000000000000000000000000..1765203bfe72dc67fef2c16f093ffcbd27d3374e GIT binary patch literal 54760 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 1; + } + + return (uint8_t)p; +} + +/* + * Addition of 4 byte words + * m(x) = x4+1 + */ +void coef_add(uint8_t a[], uint8_t b[], uint8_t d[]) +{ + + d[0] = a[0]^b[0]; + d[1] = a[1]^b[1]; + d[2] = a[2]^b[2]; + d[3] = a[3]^b[3]; +} + +/* + * Multiplication of 4 byte words + * m(x) = x4+1 + */ +void coef_mult(uint8_t *a, uint8_t *b, uint8_t *d) +{ + + d[0] = gmult(a[0],b[0])^gmult(a[3],b[1])^gmult(a[2],b[2])^gmult(a[1],b[3]); + d[1] = gmult(a[1],b[0])^gmult(a[0],b[1])^gmult(a[3],b[2])^gmult(a[2],b[3]); + d[2] = gmult(a[2],b[0])^gmult(a[1],b[1])^gmult(a[0],b[2])^gmult(a[3],b[3]); + d[3] = gmult(a[3],b[0])^gmult(a[2],b[1])^gmult(a[1],b[2])^gmult(a[0],b[3]); +} + +/* + * S-box transformation table + */ +static uint8_t s_box[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, // 0 + 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, // 1 + 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, // 2 + 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, // 3 + 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, // 4 + 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, // 5 + 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, // 6 + 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, // 7 + 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, // 8 + 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, // 9 + 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, // a + 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, // b + 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, // c + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, // d + 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, // e + 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +};// f + +/* + * Inverse S-box transformation table + */ +static uint8_t inv_s_box[256] = +{ + // 0 1 2 3 4 5 6 7 8 9 a b c d e f + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, // 0 + 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, // 1 + 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, // 2 + 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, // 3 + 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, // 4 + 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, // 5 + 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, // 6 + 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, // 7 + 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, // 8 + 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, // 9 + 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, // a + 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, // b + 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, // c + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, // d + 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, // e + 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +};// f + + +/* + * Generates the round constant Rcon[i] + */ +uint8_t R[] = {0x02, 0x00, 0x00, 0x00}; + +uint8_t * Rcon(uint8_t i) +{ + + if (i == 1) + { + R[0] = 0x01; // x^(1-1) = x^0 = 1 + } + else if (i > 1) + { + R[0] = 0x02; + i--; + while (i-1 > 0) + { + R[0] = gmult(R[0], 0x02); + i--; + } + } + + return R; +} + +/* + * Transformation in the Cipher and Inverse Cipher in which a Round + * Key is added to the State using an XOR operation. The length of a + * Round Key equals the size of the State (i.e., for Nb = 4, the Round + * Key length equals 128 bits/16 bytes). + */ +void add_round_key(uint8_t *state, uint8_t *w, uint8_t r) +{ + + uint8_t c; + + for (c = 0; c < Nb; c++) + { + state[Nb*0+c] = state[Nb*0+c]^w[4*Nb*r+4*c+0]; //debug, so it works for Nb !=4 + state[Nb*1+c] = state[Nb*1+c]^w[4*Nb*r+4*c+1]; + state[Nb*2+c] = state[Nb*2+c]^w[4*Nb*r+4*c+2]; + state[Nb*3+c] = state[Nb*3+c]^w[4*Nb*r+4*c+3]; + } +} + +/* + * Transformation in the Cipher that takes all of the columns of the + * State and mixes their data (independently of one another) to + * produce new columns. + */ +void mix_columns(uint8_t *state) +{ + + uint8_t a[] = {0x02, 0x01, 0x01, 0x03}; // a(x) = {02} + {01}x + {01}x2 + {03}x3 + uint8_t i, j, col[4], res[4]; + + for (j = 0; j < Nb; j++) + { + for (i = 0; i < 4; i++) + { + col[i] = state[Nb*i+j]; + } + + coef_mult(a, col, res); + + for (i = 0; i < 4; i++) + { + state[Nb*i+j] = res[i]; + } + } +} + +/* + * Transformation in the Inverse Cipher that is the inverse of + * MixColumns(). + */ +void inv_mix_columns(uint8_t *state) +{ + + uint8_t a[] = {0x0e, 0x09, 0x0d, 0x0b}; // a(x) = {0e} + {09}x + {0d}x2 + {0b}x3 + uint8_t i, j, col[4], res[4]; + + for (j = 0; j < Nb; j++) + { + for (i = 0; i < 4; i++) + { + col[i] = state[Nb*i+j]; + } + + coef_mult(a, col, res); + + for (i = 0; i < 4; i++) + { + state[Nb*i+j] = res[i]; + } + } +} + +/* + * Transformation in the Cipher that processes the State by cyclically + * shifting the last three rows of the State by different offsets. + */ +void shift_rows(uint8_t *state) +{ + + uint8_t i, k, s, tmp; + + for (i = 1; i < 4; i++) + { + // shift(1,4)=1; shift(2,4)=2; shift(3,4)=3 + // shift(r, 4) = r; + s = 0; + while (s < i) + { + tmp = state[Nb*i+0]; + + for (k = 1; k < Nb; k++) + { + state[Nb*i+k-1] = state[Nb*i+k]; + } + + state[Nb*i+Nb-1] = tmp; + s++; + } + } +} + +/* + * Transformation in the Inverse Cipher that is the inverse of + * ShiftRows(). + */ +void inv_shift_rows(uint8_t *state) +{ + + uint8_t i, k, s, tmp; + + for (i = 1; i < 4; i++) + { + s = 0; + while (s < i) + { + tmp = state[Nb*i+Nb-1]; + + for (k = Nb-1; k > 0; k--) + { + state[Nb*i+k] = state[Nb*i+k-1]; + } + + state[Nb*i+0] = tmp; + s++; + } + } +} + +/* + * Transformation in the Cipher that processes the State using a non­ + * linear byte substitution table (S-box) that operates on each of the + * State bytes independently. + */ +void sub_bytes(uint8_t *state) +{ + + uint8_t i, j; + uint8_t row, col; + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + row = (state[Nb*i+j] & 0xf0) >> 4; + col = state[Nb*i+j] & 0x0f; + state[Nb*i+j] = s_box[16*row+col]; + } + } +} + +/* + * Transformation in the Inverse Cipher that is the inverse of + * SubBytes(). + */ +void inv_sub_bytes(uint8_t *state) +{ + + uint8_t i, j; + uint8_t row, col; + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + row = (state[Nb*i+j] & 0xf0) >> 4; + col = state[Nb*i+j] & 0x0f; + state[Nb*i+j] = inv_s_box[16*row+col]; + } + } +} + +/* + * Function used in the Key Expansion routine that takes a four-byte + * input word and applies an S-box to each of the four bytes to + * produce an output word. + */ +void sub_word(uint8_t *w) +{ + + uint8_t i; + + for (i = 0; i < 4; i++) + { + w[i] = s_box[16*((w[i] & 0xf0) >> 4) + (w[i] & 0x0f)]; + } +} + +/* + * Function used in the Key Expansion routine that takes a four-byte + * word and performs a cyclic permutation. + */ +void rot_word(uint8_t *w) +{ + + uint8_t tmp; + uint8_t i; + + tmp = w[0]; + + for (i = 0; i < 3; i++) + { + w[i] = w[i+1]; + } + + w[3] = tmp; +} + +/* + * Key Expansion + */ +void key_expansion(uint8_t *key, uint8_t *w) +{ + + uint8_t tmp[4]; + uint8_t i; + uint8_t len = Nb*(Nr+1); + + for (i = 0; i < Nk; i++) + { + w[4*i+0] = key[4*i+0]; + w[4*i+1] = key[4*i+1]; + w[4*i+2] = key[4*i+2]; + w[4*i+3] = key[4*i+3]; + } + + for (i = Nk; i < len; i++) + { + tmp[0] = w[4*(i-1)+0]; + tmp[1] = w[4*(i-1)+1]; + tmp[2] = w[4*(i-1)+2]; + tmp[3] = w[4*(i-1)+3]; + + if (i%Nk == 0) + { + + rot_word(tmp); + sub_word(tmp); + coef_add(tmp, Rcon(i/Nk), tmp); + + } + else if (Nk > 6 && i%Nk == 4) + { + + sub_word(tmp); + + } + + w[4*i+0] = w[4*(i-Nk)+0]^tmp[0]; + w[4*i+1] = w[4*(i-Nk)+1]^tmp[1]; + w[4*i+2] = w[4*(i-Nk)+2]^tmp[2]; + w[4*i+3] = w[4*(i-Nk)+3]^tmp[3]; + } +} + +void cipher(uint8_t *in, uint8_t *out, uint8_t *w) +{ + + uint8_t state[4*Nb]; + uint8_t r, i, j; + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + state[Nb*i+j] = in[i+4*j]; + } + } + + add_round_key(state, w, 0); + + for (r = 1; r < Nr; r++) + { + sub_bytes(state); + shift_rows(state); + mix_columns(state); + add_round_key(state, w, r); + } + + sub_bytes(state); + shift_rows(state); + add_round_key(state, w, Nr); + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + out[i+4*j] = state[Nb*i+j]; + } + } +} + +void inv_cipher(uint8_t *in, uint8_t *out, uint8_t *w) +{ + + uint8_t state[4*Nb]; + uint8_t r, i, j; + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + state[Nb*i+j] = in[i+4*j]; + } + } + + add_round_key(state, w, Nr); + + for (r = Nr-1; r >= 1; r--) + { + inv_shift_rows(state); + inv_sub_bytes(state); + add_round_key(state, w, r); + inv_mix_columns(state); + } + + inv_shift_rows(state); + inv_sub_bytes(state); + add_round_key(state, w, 0); + + for (i = 0; i < 4; i++) + { + for (j = 0; j < Nb; j++) + { + out[i+4*j] = state[Nb*i+j]; + } + } +} + +/*******************结束*********************/ + +//将原始string转换为密文 +//原始数据长度: orign +//加密后的数据:text +bool EncryptDataToCipherTxt(uint8_t *orign, uint8_t *result, uint16_t length) +{ + uint8_t w[240]; //密钥扩展,定义最大长度 + + //根据密钥长度计算Nk,Nr + switch (sizeof(key)) + { + default: + case 16: + Nk = 4; + Nr = 10; + break; + case 24: + Nk = 6; + Nr = 12; + break; + case 32: + Nk = 8; + Nr = 14; + break; + } + + //计算出扩展密钥的值 + key_expansion(key, w); + + //分块加密,每段16字节 + if( length % 16 == 0 ) + { + uint16_t i; + uint16_t counter=length / 16; + uint8_t *p,*q; + + for(i=0; i +#include +#include +#include +#include + +extern uint8_t *key; + +//加密 +bool EncryptDataToCipherTxt(uint8_t *orign, uint8_t *result, uint16_t length); + +//解密 +bool DecryptCipherTxtToData(uint8_t *orign, uint8_t *result, uint16_t length); + +#endif diff --git a/aes/aes.o b/aes/aes.o new file mode 100644 index 0000000000000000000000000000000000000000..017b97c307588729b72d08dbfd8c99790dab5289 GIT binary patch literal 47816 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 literal 0 HcmV?d00001 diff --git a/aes/main.c b/aes/main.c new file mode 100644 index 0000000..9f0dd17 --- /dev/null +++ b/aes/main.c @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include "aes.h" + +#define AES_ENC_MAX_LEN 8192 + +uint8_t *key; + +void from_hex(char *s, int l, char *d) +{ + while (l--) { + *(d++) = ((*s > '9' ? (*(s++) + 9) : *(s++)) << 4) + | ((*s > '9' ? (*(s++) + 9) : *(s++)) & 0x0F); + } +} + +void StringToByte(char *source, unsigned char *dest, int sourceLen) +{ + + int i; + unsigned char highByte, lowByte; + + for (i = 0; i < sourceLen; i += 2) { + highByte = toupper(source[i]); //转换为大写 + lowByte = toupper(source[i + 1]); + + if (highByte > 0x39) + highByte -= 0x37; + else + highByte -= 0x30; + + if (lowByte > 0x39) + lowByte -= 0x37; + else + lowByte -= 0x30; + + dest[i / 2] = (highByte << 4) | lowByte; + } + return; +} + +int array_len(char *str) +{ + int i = 0; + + int Len = strlen(str); + unsigned char out[AES_ENC_MAX_LEN] = { 0 }; + + StringToByte(str, out, Len); + for (i = 0; i < Len / 2; i++) { + ; + //printf("%02X ", out[i]); + } + //printf("%d\n", i); + + return i; +} + +int main(int argc, char *argv[]) +{ + key = (uint8_t *)malloc(128); + strcpy(key, "1234567890ABCDEF"); + char string[AES_ENC_MAX_LEN]; + + int opt; + char optstrs[] = ":e:d:k:h?"; + while (-1 != (opt = getopt(argc, argv, optstrs))) { + switch (opt) { + case 'k': + strcpy(key, optarg); + break; + case 'e': + { + memset(string, 0, AES_ENC_MAX_LEN); + memcpy(string, optarg, strlen(optarg)); + uint16_t i = 0; + uint8_t out[AES_ENC_MAX_LEN]; + + uint16_t length = strlen(string); + + while (length % 16) { + strcat(string, "\0"); + length++; + } + + //printf("加密数据:\n"); + EncryptDataToCipherTxt((uint8_t *) string, out, length); + //printf("密文长度=%d\n", length); + for (i = 0; i < length; i++) { + printf("%02X", out[i]); + } + printf("\n"); + ; + } + break; + case 'd': + { + memset(string, 0x00, AES_ENC_MAX_LEN); + + uint8_t out[AES_ENC_MAX_LEN]; + memset(out, 0x00, AES_ENC_MAX_LEN); + + from_hex(optarg, array_len(optarg), (char *)out); + //printf("%s\n", out); + + DecryptCipherTxtToData(out, (uint8_t *) string, array_len(optarg)); + //printf("解密报文长度=%d\n", array_len(optarg)); + printf("%s\n", string); + } + break; + case ':': + printf("\nMissing argument after: -%c\n", optopt); + case 'h': + case '?': + + default: + ; + } + } + free(key); + return 0; +} diff --git a/aes/main.o b/aes/main.o new file mode 100644 index 0000000000000000000000000000000000000000..bbb06c3c71310cf1be4da68e3a9700227ce6d7eb GIT binary patch literal 20816 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 IVOzHUU%rFTO#lD@ literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..a137aea --- /dev/null +++ b/main.c @@ -0,0 +1,289 @@ +#include +#include +#include +#include +#include + + +#define LIBSSH_STATIC 1 +#include + + +#define BUFFER_SIZE 1024 + +int verify_knownhost(ssh_session session) +{ + enum ssh_known_hosts_e state; + unsigned char *hash = NULL; + ssh_key srv_pubkey = NULL; + size_t hlen; + char *hexa; + int rc; + + rc = ssh_get_server_publickey(session, &srv_pubkey); + if (rc < 0) { + return -1; + } + + rc = ssh_get_publickey_hash(srv_pubkey, SSH_PUBLICKEY_HASH_SHA1, &hash, &hlen); + ssh_key_free(srv_pubkey); + if (rc < 0) { + return -1; + } + + state = ssh_session_is_known_server(session); + switch (state) { + case SSH_KNOWN_HOSTS_OK: + /* OK */ + + break; + case SSH_KNOWN_HOSTS_CHANGED: + fprintf(stderr, "Host key for server changed: it is now:\n"); + ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen); + fprintf(stderr, "For security reasons, connection will be stopped\n"); + ssh_clean_pubkey_hash(&hash); + + return -1; + case SSH_KNOWN_HOSTS_OTHER: + fprintf(stderr, "The host key for this server was not found but an other" "type of key exists.\n"); + fprintf(stderr, "An attacker might change the default server key to" "confuse your client into thinking the key does not exist\n"); + ssh_clean_pubkey_hash(&hash); + + return -1; + case SSH_KNOWN_HOSTS_NOT_FOUND: + fprintf(stderr, "Could not find known host file.\n"); + fprintf(stderr, "If you accept the host key here, the file will be" "automatically created.\n"); + + /* FALL THROUGH to SSH_SERVER_NOT_KNOWN behavior */ + + case SSH_KNOWN_HOSTS_UNKNOWN: + hexa = ssh_get_hexa(hash, hlen); + fprintf(stderr, "The server is unknown. Do you trust the host key?\n"); + fprintf(stderr, "Public key hash: %s\n", hexa); + ssh_string_free_char(hexa); + ssh_clean_pubkey_hash(&hash); + + rc = ssh_session_update_known_hosts(session); + if (rc < 0) { + fprintf(stderr, "Error %s\n", strerror(errno)); + return -1; + } + + break; + case SSH_KNOWN_HOSTS_ERROR: + fprintf(stderr, "Error %s", ssh_get_error(session)); + ssh_clean_pubkey_hash(&hash); + return -1; + } + + ssh_clean_pubkey_hash(&hash); + return 0; +} + +int show_remote_processes(ssh_session session, char *command) +{ + ssh_channel channel; + int rc; + char buffer[256]; + int nbytes; + + channel = ssh_channel_new(session); + if (channel == NULL) + return SSH_ERROR; + + rc = ssh_channel_open_session(channel); + if (rc != SSH_OK) { + ssh_channel_free(channel); + return rc; + } + + rc = ssh_channel_request_exec(channel, command); + if (rc != SSH_OK) { + ssh_channel_close(channel); + ssh_channel_free(channel); + return rc; + } + + nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0); + while (nbytes > 0) { + if (write(1, buffer, nbytes) != (unsigned int)nbytes) { + ssh_channel_close(channel); + ssh_channel_free(channel); + return SSH_ERROR; + } + nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0); + } + + if (nbytes < 0) { + ssh_channel_close(channel); + ssh_channel_free(channel); + return SSH_ERROR; + } + + ssh_channel_send_eof(channel); + ssh_channel_close(channel); + ssh_channel_free(channel); + + return SSH_OK; +} + +int authenticate_pubkey(ssh_session session, char *priv_name, char *passphrase) +{ + int rc; + ssh_key pkey = NULL; + + //从文件中个导入密钥 + rc = ssh_pki_import_privkey_file(priv_name, passphrase, NULL, NULL, &pkey); + if (rc != SSH_OK) { + exit(-1); + } + + ssh_userauth_publickey(session, NULL, pkey); + + ssh_key_free(pkey); + return rc; +} + +int rsa_file() +{ + char rsa[8192] = {0}; + + char temp[] = + "./aes/aes -d \"FE67236A61D8D67FD4DEBFD46C9E409B94326781DAE97A7DCD84426711D4D0E078EBA98886342F1E8568828843886DCC38487ACDC9C413D73A4E0C80E6070D054FD5E0DCC0771452FC5E31FCF715EFC62177EABE9014E7F9623B4EA843A93A9020A268F9E8A300BB5D30AD22D52F6EA441222205DAF5560A82F18F28075C035205BF4A47E8E350A957B1F7E90AB63AC2FCCCAC23E1C9C3B50F34B32CDBC7BC8B2155475FBC0B794089C60BFA0EFDD2E096D65DAF31A40E31A5D2C1547A4EA622241EEDD9307CB74BFB3C82E5F48FB1A2CA6D5B223BBB9807B6E54487F4F116D7D9EA2320BFE025ED8B88DBF13F79884C8ACB9161793D59D527579319173EC5A0784398C81435FB0536C048AE656F54422BC41207E0DD3E0B66DB70D725B644915D967D9BA56FC9FE1BF8D628D00D5F6835E48CF9C2B9BCB995EC84D881444F0269272FEE8D4FD667A6C909ADB500FB83E25DB45C9CE75044D2C052E72271665BC37AF036D4A81A889BB8A211B4B9730C0ECC9C70B8B4A07BC4D5A2C274361517DE7C8E87E1AC0A66F3D99F593BE77F1B1343323C92F85B4801957E0F32CAB604252028ACB779E1DCA318A8A9F367F7BF9B4D7CDFEC06D878AF6D4EB4BD7F564BA7134479721CECA232CB0C0FD0F63C6FCC63EA393BA06E13FCF691FC40939B6B332842D8046EBC8049C0971FADACBBE3D28C80FB2F59FFCE1482D050FF3BDB22EF9E67295EB3C1F045EF3CB0F638CE5437E20F8126725E5DF1A867F59407795288B5E69385BDED43E1484886B08BCA06A84938F6BED0CF1326BA149FD3E45E533E3AC48E222025CBD27A33DD6A9BF46F35F601CE8E54DBD6E0ECECE1ECC8D6091F86836C781AC5D21E390FFF2CAAD3FA72497548365E77981C24707B3206E679035D668AE66245EA900FE533E8B935C84D5755ECA88AF396B52C7CBEDB448860D826DD0BEE671F07DE374AE31E71883AF95A45F38066C5BC78C49C783B85395A23627BF202397143F556DE4FB0C39977824834C4716C44435FC5B6286BC14E5D3DFE4C7133A88772509A54C80CCCE45433F7271E6434E37BB20754CA8C9462499BC4DA5E2010B06B05514F5FE7532E873D8918C594D28E2446D074B205589F1A50933EAE1165C48632CC110193D3CA6C6CE001E137A218AA9D09EA918881B5635BCADE6670CD061D7D9302561A5B7D4D752A67FAE30C30FD9D1C7CF83D7700ABD455CA2E190183361F9CF25D963E51CBC601E0FC9D752D45E0A72ACBDEE319927F72D023DB94BEB5DFF2153CC4D6187406A44FF8DEFD7045B3E5DF08A06851CF9B462804F339EB96F7D68BCEE2A3860E5DFD26C2884C121DCF3168185CB261FFE3C6F15343CC4769D0632214CC77EF6313D290D7F42CF317DD90FA6CC98983318863FB2A4C43E231F043CDEEF59C305F06B6AF08683B681CD6C7D7CB6B56EE778ED9FD2790C3D34C3754BD7E8A243D4813542E1DF34D127754F93A205F7889E14D9B21E1760318152E6E67FA608D1610CC1894A127595AF80A939A0FD1A18B5662F79AF3CB0EF0276767DFB062A1BD35CA95912F0B31D5951E0A4245856DDE9F11A782148ACC56F38D866B5505E5DBC2FA1204469AB5D44F996DFEE88F35E47ED8206EA5B537A77C175FAB0A392E6FA8C2BF69D63593D7F78CE72145228BD1CDC1ECC051869DF09CEC01DA31F997250D953745A28C61EB7EB379010518D83F8E1A27A81EA78C84DC7D12F64593D3051A5DA89CCF88580E4CE752F6A528041ADF62268F84F09A5CA7E66F6C4AA3E1FC481813C614BF4F783F5E9AC0846178DA1A7EB24BE1B0620826E34D4AC1C72F820DACBDA40294272093FCA2765DC7C052CCDA64A3C7998E0ADBD118FECC3260529D44D4B10BDA8CE9C9AAD5D15D799B0EB2B4976CBE99B78E4068C1105924D2CCC08FCE95B5963ABDF316D47417D7C73510450386565BDED107F4F278B6CA29D5109C5324CEEFA28A5B84F843932991DE2D1DF828916A097A53B233DF1B82DC084D624BF7F35BF0E2A551EFBCDD0A0B8324A68636B9B72BA68D1A1C6A89B7A736BC82381AE3CD6B4A5CCE0ED35C2B17ADD63BA8C908256AE5297AEC9D9ABD2EBE95A43617383F420AF893752B4B03463AAB3B88E3F835FD19504A615AFC739995D93960987235CA0FBAE7D9626045B2E6382521C4CF01C07AC26E9E1C5CFEAF782AD97E983F3A43F8E90314AC32C60D44AF7CBB1EC74C8BB5139526B2A577BCC2558503842F3AD9A2026D2ED104D462D035AB2CC3802D7136DFC938067F4EFD38ECFDBAE8FE30BC3342D3354628F0F87EDCD5F6A005F69A32A30DA6C6AC2188C3A11790867797D2D03D836B9F6FFD55C590F1AC8DF4A0F63B5201987C9AA05B4EAA91466E4D5454549E184306EB59381CAA20A3B1EFE7EFFC97A98A48E8712A0A98B4E39F050BFF5EFB72917E60DD1992DFC77840F00862FA81D34FBF774AB060B80E0805E63C65CE0B5651256D42A8376FD734BEECE02A58651CC8F567EAD91C0C60690D8C9104205A338B3DAB0F75221BE9AE505CFCB2343F9FD68CC79F96795C8ED06866B32CF12456C30232CDF5D1F8EB253777264EF7D3706E875DF54FC216B2DC90C6653D813E9135288730FC6A9178079D6E89694D9CC4CF828F06AE954224402B1FE2BBBA5A6DECA5344DD11DB77AE49D0BB3DA38FCACC15F8AD1BC5A6212F93F2AD285F5915A4AD642239CDB3240CD622E4DBEE18366BB2CB4604F92D8EFC693C3AB2F90AD84FCFD88CB461C3DF89043E94EFBF08FED2B98C5835CBFC3EDDBA653A33D35BA2E2D08F7ADA87A12FAF76DF84D170BD92A56E62DE8B8B0D1CCAEB4DB4BF7D2FA9F8F23A8443638D721BCCDD31D5396EE2BD5FB3F28BC877BF430908415DB46E3B93AF80016036B9CFA933486B83C19061387478808ABE63FDA4B0B76B3AD50343E540EC4F80400A362627273FC1EE643B6B7736B9338A7F1433780574224674D6F625BEAD125F3AD383EEAA12AFAF0DC812039741034A74423F57F82436542EE1FAA31EB72A98E8D060B992BD5954A42416C5C2A3C826D2F8743D9487DA95DF047B329E7FB125216FA1DE2577DA00998872C8B46FE665A20366EF8C839AA8F549C06917C2C752C72963FA1C619F0ADAB3E1309622E6B5EF01A31EB78380CBC657282604FA98AA9B51596F45B7CD3BEE7CD6E2AAC43224C052911EA564481B3FC4AE054BBF72666447110FA193CE8BB277F6D3D069A0BD7EE7D01075FA7E729F5F6E70E890287B52DC423180081FB7E267AC68EAB94786E73235530BB78A1C4AA5998529820572970063C09D1B15DBD2596D3BFD3DA6AA0CC600D9ADCE8D9EAAE3819B01F482BD852917CEB7C006E6E8FEB057EB0AC9A525A72EA433096C51C279506322F84D76E47612FE2BCD27849F6FE7CEC0DBEA27BEC270A696AB84DA1CCB190A97115447FDBF9362B23E89BCD9960A4436B8324903254E28344DB6376E25D2857CD37BAA99D656293E8F82D3A74DD4026D14B1F8935D581F973BBF5B75170E2655512C6CA0415193B75BE9EEB0F7F9884A7FF11BA473056D556FC7281A9DCD79B3F93515565A3079034C1C5C9DF838AD40897F37D74C090269914F89A60E3DB12CDB79E5CAE0F200310D0C1190047D314857DE44A62AFB1615CFBD25B93E2ADD774937660C9B8231D9D952E728CC0D67A74E76BEEE93189C9BA89EB55D933AD898C77ADF21C7DB40394525F0F3B1DDE711B54228DAA\""; + + FILE *fd = popen(temp, "r"); + if (fd == NULL) + perror("popen"); + + fseek(fd, 0, SEEK_END); + long file_size = ftell(fd); + rewind(fd); + fread(rsa, file_size, 1, fd); + rsa[file_size] = '\0'; + //printf("%s", rsa); + fclose(fd); + + FILE *rfd = fopen("aixiao.rsa", "w+"); + fseek(rfd, 0, SEEK_SET); + fwrite(rsa, strlen(rsa), 1, rfd); + + fclose(rfd); + + return 0; +} + +void help_information() { + puts("\n" +"remote command\n" +"Author: aixiao@aixiao.me\n" +"Usage: [-?hlfpkib]\n" +"\n" +" Options:\n" +" -l : host\n" +" -f : port\n" +" -p : passwd\n" +" -k : private key passwd\n" +" -i : private key file\n" +" -b : command\n" +" -? -h : help information\n"); + exit(0); +} + +int main(int argc, char *argv[], char **env) +{ + + int rc; + int verbosity = SSH_LOG_PROTOCOL; + ssh_session my_ssh_session; + + char host_ip[BUFFER_SIZE]; + char password[BUFFER_SIZE]; + char *priv_name = "aixiao.rsa"; // 私钥文件名称 + char priv_passwd[BUFFER_SIZE]; // 私钥的解密密钥 + char command[BUFFER_SIZE]; + int host_port = 22; + + memset(host_ip, 0, BUFFER_SIZE); + memset(password, 0, BUFFER_SIZE); + memset(priv_passwd, 0, BUFFER_SIZE); + memset(command, 0, BUFFER_SIZE); + + int opt; + char optstrs[] = ":l:f:p:k:i:b:h?"; + while (-1 != (opt = getopt(argc, argv, optstrs))) { + switch (opt) { + case 'l': + strcpy(host_ip, optarg); + break; + case 'f': + host_port = atoi(optarg); + break; + case 'p': + strcpy(password, optarg); + break; + case 'k': + memset(password, 0, BUFFER_SIZE); + strcpy(priv_passwd, optarg); + rsa_file(); + break; + case 'i': + priv_name = optarg; + break; + case 'b': + strcpy(command, optarg); + break; + case ':': + printf("\nMissing argument after: -%c\n", optopt); + ; + case 'h': + case '?': + help_information(); + default: + help_information(); + } + } + + my_ssh_session = ssh_new(); + if (my_ssh_session == NULL) { + exit(-1); + } + + ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, host_ip); + ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); + ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &host_port); + + rc = ssh_connect(my_ssh_session); + + // Verify the server's identity + if (verify_knownhost(my_ssh_session) < 0) { + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + exit(-1); + } + + if (strlen(password) > 1) { + // Authenticate ourselves + rc = ssh_userauth_password(my_ssh_session, NULL, password); + if (rc != SSH_AUTH_SUCCESS) { + fprintf(stderr, "Error authenticating with password: %s\n", ssh_get_error(my_ssh_session)); + ssh_disconnect(my_ssh_session); + ssh_free(my_ssh_session); + exit(-1); + } + } else { + // 私钥认证 + authenticate_pubkey(my_ssh_session, priv_name, priv_passwd); + } + + // 传递远程命令 + show_remote_processes(my_ssh_session, command); + + // 从一个会话断开连接(服务器或客户端) + ssh_disconnect(my_ssh_session); + // 释放已分配的SSH会话句柄 + ssh_free(my_ssh_session); + + system("test -f aixiao.rsa && rm aixiao.rsa"); + + return 0; +} diff --git a/main.o b/main.o new file mode 100644 index 0000000000000000000000000000000000000000..c29a465965e75aba81c0e9b7d0b59ec52fd18c80 GIT binary patch literal 46088 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 w)BHi|ZnBT`aCk#PtMmJyBdw64#~T zda}5lBCct1Jyl#!6W7zlHF^*03~_&^xSl1h%NsN?x25&#O*LUGBz+~0ri6!}d!%;@ za{zqTFW^m%BPemSL#1Hsgby+$ksMzc-V3_3Rcz5%zma%+hFWy7VE2T;l1J_>FA@1C z=lxn?714aQovKeBIa-eLpOg8WQJJS_l6A`z(R^Ogj70e_$oy4N{)=4i{pCd?qg5mE z)h4oit^F^e-iOL3OrI~=Lk0475#J=fy~KvIK5+?%PLdDLLS|{AH(@SKT#{IA;5|A{ zSv+_x$d@KIw_HmkEqigjq~(nY&4r*DW18zU{LPGCui@{D@M%ZxD7WIhJx*nKqgvI( z_6w5i7L{y0p47;;AoC}#g=C8w(V|vJB&T4WqDDj{=c5hOjg4&l1{zDy+^^77z~}NB zO}*?@@LS_e@G;Qe%DAeS>w!N|qpyjqk_=&<{<2Ck?Fgx$*6Q29;zzaTb^M*c|I!5i z0Pv--52#=U+!3c5yEno^hSB3lL(`5NF1JDfQ3uuN{uyj`Okq>&zYewkj)Hcw#bkGwuP0*lgfog>&AW;3u#i-{jlN7e+)Re67!4 zi^7fO5E&QsVq|TnL;wvX0X(>nr>Xr7*0G8EGjSJ<@n}lge}+1bFqTv23C2Pd6Vuee zCR4#pv%dpdYB{p2rj(tKeg&#S3zEN1^g?g=xP%md{@+BGEg-L}stWpxB6?{jbuWD* z9@g}t4!>wt?rCW5UuwYbVypBhS1s zDz>G8rly12A@&Ja8b&(UTyN~V@E{XCXt39Nfp4tgWZ3Gg_b+(5tM;_c?J?jtG{OHJ z_cMyAklnraGB|IIy#f^(T7 zcR6n%l}R3XnBC`mHt{vl;{~(M27Sws&WOXph8Rm2&T-9+;&*664k3Qj4pRA%HFb3+ zVbNQ}(1-SgH5;3Y0&lFbt20^({DTqR;Nr*HlJIe6A8 zrV1$dM?0ETpg4G%epd)eWriRrRO8NrT^O-zz&+sG7*{Q~8~6m{>a0QZhnmonxF3)3 zX5y}IY}ohXDRLS!e;UMr@W&)Yokfb)ji0gvU%6bci#xfdCErW@~dH76H zxPOL3{(*+&nUtf{^3c56ecR=;YWMBebet7YU{SlRWpO>Ty=87a^W#K4(|%)OPW{R6 zRkGhE=GC91TI!jWxyf0zC)2wU^~{XvN~P0F%9EDCmf7_(SGUy5Oiw54Qcu5Meew~d z(&_)IGPt>APOa6`|D&#f>AzEW-PTfX+Vttkdi^urt+w+QYUWK!l`}q-P*nJYqO}=c zQZpY{GY>0Tn>nmL`J9^hrkd$cB{)va_${X|mpwY$s3~wpd&~TK=D1|NZ)W^Rsei_W zDzC>|>Q*!BjJh`34<$N`#Jt2A9SdeAJ5KD_yl7rxE`sisY3-xEY4g951d?P z%$#`vC=ep^ErR&e9H1~@`XH+5XBza;wjh!0m^m{lO#$tU*$OiUCEDxUvG=n8PtU`= zFe{N*w}9wpp9(&!K-ZB|3SPK`h~`WK^9yEDh4l*NE(hI7C@@dlV1AuHEm0#%6=xFH z1q~$`T(~lE;S$->vzDw|FfTEG`kKY>@Rm@K<5EifEsH+xK{Lk#Ym=H`Y!T$tvBj$F zEtmzDGyoB^6P6~d1)CBNdo!utEi<>yyiCY?V#=^k|4Ebk6X+beUHazz38Q845f7YB zmN3b93Nl7SlNNfz4)3XIs~TE#n)*a*?dc7zKt0Q9#LyNgCoP0KgS7&Xy8FzP26fGF zhg2hi_y!1chOxW>0uY-L#%BFl!g!qyO*4L-*nGE+HX+nW>iLAxThByy3FA^7qKbN( zRP;9z>g*_=FfP$ys^yX?wdhn);f*?+Fs48{iOe@4ZPMny4T?@JBGWG%eZFj8ey%mYgD)UP|Vhj-e@~ zz_^JP8i#Cs^-dRLWqL3 zjbfb%<^MKwX=1fa8rqa?DAz>kQ;A{-n^1vlq&ySqiZJNBg7 zll#uAKbXlbgQX;CDS*>+c`x&Xk*^tr2M{0H# zxW0}1>28*H!;kJpnFUp$wRG!#WYkV?r%nepFV(&(mAEg}etIhLhE)3jlG$Wd4~mKb zoXR}k_Co4-h?2S>b^Hyf)YjDT)Eso`s@8?6g{yIY@U^LVM9{V>HE%q6b`SOBg7=8t z8~I%8qp2li9OqH(OIks*zBM^}3*OI3poyx0M**Z3l8AGlzu7C%q2pC3e?i;*$X~O6 zYidSvVn6CQu#oz30Yqr`=*fGawChQh1?RV|Z|j0(&umRrp}tvd^HF6YHS_Dx$q|_8 z?AEp`Ur6pd{K6frcaOK8fA_=#sYQ4`yY=6a)kmkbpvK!FL~@}}LwnoGX`;*i>$;1Q zvk$i|KwYz{q>s8Wq*~wpbla(Ir?LKSLOqF88wq)fyq(dyi|zmEn*Cq&g@Xq_L0YKZC64{NLy{>is z`fzKx(?zMCPS-NV2d}AsZ+RSVz*e_U3>a`~!~wstFjS^DFw5f=ymC1bF*sKtP2BUXap~Qip#|C_~6dr$`1NX1tBmzW;tR+;_nz7=O2kM_UtPYqP9UQ zOGq!8qPE$Pue1sfzt9jpjDB+hx*ge3>EByzXrAAF@y1PIPY=4F?3a5KIfZzUq)_P? zdQo`h!Qt}2Rrpa0v>&p;)zjO=kTGJb_0q*bUX`!hKQscxmFW%N;gPy2RL}*{yaA=+ zb>RjH*L%Ub4ZUSjW+a^utU6X583L!FzMbPn`KrMkmGX|hYF|T1wQW6R9}1WlgA#@& z_C#hV^`TnLz*r?}nKYxZ${Qx|YH+!7b*0}Zj|}Y~W2WZ94hAY?4b2-zL&}wrfd(no z_Vlo2{yIO>jeZ5O%p+jkOy#r|~_}v}LZ$thCbjQX9VSY?V_NTXQ zLx9)qHyNV2tM&|6SM{&jj352L?|1CjGdR2|sEqGM^s$QD#8D1;98``UKxt?Y_Y0bJ zX}GE0FKU}>oi$2hsZ6#pRvE`QXzbyQZcoo;-J62QM#snYa<>@#zIsDn4~}y`M?Y2) znRG+%lDuMs2^XmvXB2^nR;bRb?j%*TySI~jtgCx%d7}&8+1sFijhni+Y{eM4*xeAh zJfbUY-rx&=99iJtXhRWYM3MU=f3E6_ymPq4?{qh;4aMjl@7r66oTW-e^+4xdcMk?a zxu>hA6KySp?g>02H67Da;$4LxiO zZ{LS+SD>%NARIT8FJr**2oHwAJ~UcZzP(}eRYwLJc+zZ#uI({ugC!CYI-n_8sE^`+ z+PqrRpKy<5TFD5}hbvbZ<-NkmNMBBR$5&*^gL}y3!WjVkH)LgD`e8@ zfZNdBTP}5P#$XbCg5N}HoN6h+5!OxxNkf;pn>MW5u-4$IrlGZ<$r!Lq{NIT8Zd&K} zvM&72&|ly1SeheEcLN-L2{pmO_ll+{lT5i%*CkD=QX8PfR7Ww%@Cccj_&SX-5KZ1B zyqp5yL43pxWxsnvY28{97h?+@O^oau43zXLY`J1!&a7bEqPIl!Cn6}y2^S%4Uq~D~ zn_<2Q*Sfu7+20h3Y1HlNX=pvEg=~BK$T)s=OFR-Ix@R+nUQZ7M8|~YXH_8*k7-Ty# zaA7;p$VL_yyS^CAWCP{lzCDmU@*@om-|Uf>5z}k*RUc|8nG8D@m3VDex94_6rV@p0 z)b8#0Nv?^}$T^PI<4Dz@B1ak+r*7z5%9RPsWkS((Op! zJT2&0ejpWeY)rl;(cZBfklV2sBwk0GKeMF-sH8w^XAWtIJG14rQy>TR9p*a!LZ70} zuvVu_b*}ArsHLR~Wdo&x^)u5T|00z^+C&$(WA4o@mvp47?HzOdjy4x(cP8MM=oylD znG*bOYw7A(d~>q1BYj}n+Ky)iTb^z2Nc$a&Q5{IVlau^pGki%5zA^?6V(|VL{0%Yq4KetU82nD) z)GwpFdoJb`=-{Ck`lB)UH)HT$#o*IWUo*W?{mt;>V(8C|!OsOQ+Qly|MB~ITx?|{f z$Kd;8@Ha94XPCd3FCqKk7<&3`+-B{%D+d3^82m#q_=7R{zsBI7h`}F^!9Ne2^!XA` zk#g97JBI#wL0_NmF!@N;AEi(>Ge z82q&{`23jhBDXqLcKJC2mpol;x)kV=p-Yx7MY@=DvFPH6yC^RJOHf&Yi6x3zf|n%< zS`ocqY!#+%0F-%^(p@U`guUfn*Xs()Vr|fL?MsV>nB|99ILjr9+~L%By?EuN>?9L6 zvA-dgtyBe8Q#dbFwj>Cgy7MVWqn-X{d#O^``X;-w&YZH&MV(C8bbC}tz()+U!cy}M zM-J+PhD~JkLA0h;k=p7`F5|>DkxEh9Wp1{QLWF;9C!@*klGv!I?OjF7*=V&ME&uq8 zB-*dyU4UqL2364(ATM91Y~hHVH#%aLoBLR1(oP$S(M}#dXb+zxmWq_?P}*M?P3EHu zy01$vcbo`Sj!P&TX)jtYgBkvZ>lWz@{vj#vgxQx~shC#8R#O1s~_&Ex` z9ru(7Ux7bKKS3Z8+?QA-Nc>iTM)*qHOZ+YcU!dUsz&P<=rQrX>IPq8cJfh&Vrj`6Z z#kkIg;wegmoA{IT-y{%8=l?xY< z^iL{KB0PgXNq?MzQ_L*!r3#)?@D&QK()*0-?d?@?nhPcWtqLEtUn&Z{+Fpv|C=q{( znkApTF?_C5a8=H`6r9!~lFxe;{%XA+R&ZLqN&1f|d{jMuLc!H~zpC(2`TtPCX%#5> zA5-|K`gujcZG~RG)uHR3;z3IEaU%XC{}UM3?d>!LSLH7#ctPQFfr2{<9x_fJYJ0mB zoYtUHo=X)zsy=U2a9Sfu`oCB3a~1r<3Vxn~Kce90EBI#=oYroVKgC&;NIw_iPvS|$ zBa{eVgFlHcR&ZCr(+aNEyIjH5dRHsBO7AJSN`IMxtMnBGSLu%^xUb0hJ_QdH`~d}5 z{r0C6JXGkv&p4@Xse;cVg&`4sGXA9Aj%S=c)+)HA;GGKYD)>4D?^5uK6uhk9>lJ)N z!D-Jx%CnbolJgV=f1`q@6@0(K=VApvqTs6h?^N&&3jO^Gu8#MQDYz=-f!#2O9on#yd6q zcE-t;C{dR5^H#<;5{M*mT8~rejXrAlos4hM@b@tOIt{0FI;AVcwa)(ojPKBJ>Bo0z z_ybHoq~RZBd{o0}T~DbRebnTCl<})I{8NlytKp9^euIWT#rQ!D|2*TjX!w^IzfHrR zW&E&)f1UBSYxuVqzeB^n%lKUy{sYGE(eNKJ{yq)=DdYEQ_%9j1U&DXJ_(K~0JH|hz z;eTZOVGVC%{1Y19!t=^e4R2-q2@P*&{Bs)qGW(M+YWRGne@4TPXZ&j#{&VK@oQ9vw z^xx6&Cz$?u4X6D>NFnr3 z;HTqW&Vz4N@U((|nDJ@&>{0NqGEV$^75v+b6a8id{~6;t{jX!_<@!aZKY`n)^FLL= zX-z8Im1SJ#vpxpDOyP5>!e@63{e(iVw)aK_zf9pn`^uC^{w?^Ea^4?R2 z!2<>N6kJ_LT%q7SOiv$YDEMm?KJ*PdDSw}WZ&Yyloj6L=UUi))_y6g!x~{p3>FMK4 z{7L@m`bAyWOe*|Uy&X|-Rd4T9a5WxlMO~EI@i$Z4MVDE8PxxH?y}5!7dFKvtR+oO*f9&Sna_lV%aiLHHT?H1|2s7NX2##E z;WN43do}z@uHauZT-xhn8ZQ0$ziap@tT#CyN&U>H8>C~=M@>KT*>LFGkCLRfxxbPu zuf$JhIp=ElSEAzhwTI|N($lYVQF@Jrzry?r8oro~n$G;^h(D46Y`?*NNf5`M3HQeR#b*YBS z{mR#A_#e1k+co?=>IkG=8va4Xhc)~#%URX%Z*%?{4gV7Jxk1B=ERUQYq&*C?-Q1?p z|B?B;Rl~o+^ml0Z%WMzt(eSTvzr0Vw2ie{}tl_(u&qp-;8rJ_48r~VH)A+oG|B~(P z84dq6>+>5LKAZj64;ZK7T&1Yt4;uZ)xn0xPUPxWULY9esR6X*~%v$iFFK1Jd`oER= zELL!$e}kaHeyoP?Wc(Zr|0(09hX0813pM;K){n2@r!(HE;Is~!V0+l2;TJM}zk-we za^Bym;oF#gNWqE!CpmwuhRgHI+cf+WEYCX>oa%j=`M*oU16rw-D8n-{A3NkoaqZ1{y7n*9Wkk$xUy z`ar`!&-m*!{8`4U8vX;uZ`1JKGX9{3w{k!JyM}i#{$mY4p7B>T{4~ZFvZJ8t$OPnj zu_r6Ium`3uY4{b4U#{S!LOQdgR8erctuXzVhVNng%^H3a<991K$tmB*{g8sw?IEWB zjE2ke=5K1ad|z)4j{`X_{*LL6XPopytmS)wD>Ph=Q%}K3PWfJPmx2=?`J)?GGA`?V zk?n7{MlavLe49r9Mew5ZfP#}Bpnn{J(nmFXh;cb@$a?$P|2(GAe~sy%((q>(|GI{E z@Vxvj4VU}*-(y_rQ^sw7R&Y|mav?o_osR@WlJt3=|CVcb$oLu!m+{jU4ew|A0~$Wg z_`5V*#w!mgILS%xSWx<;hMN&=d{)6pWq;57k7@Y38BcOtAlv&8h(!V{R;B+hZoj$7JPcfg5D>(5vi^ut63Qo7@bNum?hOc1!KQ#OojDJ(ZUts*Z z3QqOP{heQG_;j}aKPWiecC#OTMZ?!I-ZC3RNV0$BJawXm%YFZ>hRgk|OEmnG>{kah z{7J@d)bN)Wf1id=XFK__hM&avk2HK402kUmw!&I~adJ!O2dttj|XjocPFnj8AI# z%`E3*3Ql~su>C));lE}4`x-9KU|!O2xsUKC1t)nv!u7tY;rB7#!3;^CMBmPKK3~KC z$n=XCm;HM-%23K{_(c(HY}If&TctFh;R6wDT&LmhXZ&pnPD59IU+!K7r!IMn=|8F9 zM8A;)MtWAkiC&&xd{4vwOHdoeZxo#P+{1jLf7_@&u4gbF{i{O}&ZZ+ct)$LIl6srR z^d${n!uS;$F3-95YPiMpw`;gux4u`wN&a0z3dF?so@^e|475-`SkAoc=*1N}FQv%QalCKg%)rE)AFaGD9)=goazJpM5d-ehuHi{dIE;{uT`%WBRwn z;CE^G8zS`>_r%~I((s4b-~Lk!{;wLIV){p8@W(Y={`-NSjlrMM@auVeeJuw6PYpkt z>AxR?|5U?&$nyU(2LHW=Kgs^#Pcis3egQ^~U;5|FD7D4l^E6zZa~v0gpRD21{!i2J zFR`CITf;l$_>IAB4gWCHua3ce4d24+ptUjhMh%zixZW6in})C8@!l7Mzh1*X!Tx7B z2H&gU-;KJgyr&`@X4ddc%;!Y@r0yVkiJz|F@;#N6F*tq4ijw3b&qsm? zo`QF2xZEF>{y_3!GGm`c|1QoSjKOcy@LSm4=r59fCI*-9n@K(ura!9D zOZ;;hF5CN44d<-!D-Dk^lD|Cnlej$ZSf$bbf%B_1T*~ihxZK~C=YI5< z>__Tzk4FD)&dc}5B)!CM(CAmNK5x}tLm(-KQA7D8z z(D*#c_&N>0j_Z~0lS)1Z8JFiCl%=9edB5dag%91z_dn?OEhtHPiOcr^C4QLs+^Nya zea?T>aQR-uKgHnxqT%0X{_?y<*1Mi@`WF{fIpx0ek7IE8-kRj|81s?mGZL5WlHZe% z_}iKORGyb~T)u}U@yD57o&!i+o+HTj$0WXw`Ia^Q65pxek8obT4<`9Y{2Gm3zKG5E(d{IyK~SPcGo4VU_t=T1^T^t(oseyh<-zb}6} zPtr@gjn`We{|NJ05QCqn;q<#kl+KL7S8BNIUwN)2>y`a`nMVIx<}cq9m-O-+|MePu zk@Y#D;j&-esNp-9UY^fL{!y#2Ppi={=LesT!9T0vMPi8bYz+P_4Zncte-eYgq~V8{ zp8jcgN>YA_CwcuRaru3Nc`^7B4gUi3UlxO(qv6jm{puLp({PLX_u?2_zSl41mvLLa zMlbQ*8ZO`am*-}Z&p@OuJ3Of2CfnOvG+gTc9U8ux>3MjG_f&ZcL&&M_8!)NB z)8blR?{l{HA@v{uuC~^X^1UpTzoelui@6~2AzZF&wzB?o{u|iON&Fekzo_6U|1|Tb zHmU7;yN1iSdH;CT!jH2F z>K&Es6FbF^p`#vg-?x4HSY>a+WBe|6L%wgUZ+ItuWnE>_1j4^FRgqjFv9Xf=je-h( z{Cnjv{uzjs_{SVpK(zkd%%?&>sYO46{ePU&;6OGZ?OQTj!#C0nB`)nz=1;^8b=?{X z@Ml|Jbn`O%vy+gedSstU`#qC!HkYUnu4_4tsR4XLJk)d!GQ{)0Ti!xh;+espn&kW5 z)1;vMP|7dmSOdIS`7Zj=8YKGet(s&x`PqwybgzyvqQ95R%ke`PB_1YG2G?%J*3=Nb z;fd^F)+6bkxeu`K9{O<|BVB>yb@>GIzW zOy>#6_-dZ6hOt-cSe^DCK%-++ZkwNlBtN}sBH79Q z{|K;V_5W!N9w4m|*ZM`Ly&sR7)&J0kqB5Oal{KfV4Zf$2P{$hj_E>+efMxv8{A z@t|4#FLV7@azUz}j(qg`p99vc{@q;vJk1a3v|mN}X7z9RFdiVO?WcDz^!k4YjCh*( zQ`5DjC@0^$l+R@S^7BPJXjcB%rl`bnS&%d(?ZmO`*R4dh6iaq&h-t}E%T}U4 zq?Tg`hB$T-B8`*&>tKL_P3O7nD4K zC6S7HH=`cO`5!&_Fi1Ojd)4%^p35&%-d$vPC-8j&@VW59#{P2duy0$@6o5zNm zldRuMAPA{)+m2n5IXrgwJD>U2&jhtKgZDl3fdjw&Xd*;%lMKXk(UJQuUA>Cl{-g^1 zfhzn5tMFM>h0oC{_{Xd88LLA7t}65!tI$7Jg?_vW{^}}xI;+q}s^AY-(OYK~{%5P; zmsjEc%PRQKR^ek-!Mj!Dq*#%_S$Wh|;d8zU9%9bP=h`axdx4+Jk3Lz2|ASTN|Eh|9 zzFP(VW$?ceyef|efnO*smmco+N<{pBAIG2Lcrg#Xo8!+^;H7;2z~JyueyrF%TFmFA zd`su{d~ad2aG-yzSQzcxZVe0%6*{~34-~wzIZMXI4(5CN$9jf`h6+7JiNKzN-2evi zJp;pIg)+=&p}UtM4it*{gN4K03>Y6PjCPL~59UY4_Yd^<++H}s&|}5X{-Fc;zR^N~ zSdNx)8Y zFOC+62Phc;ah@a`8qN<4_jHqdQr}piaJvN2A+OZu*$1-SqX$q0riacPf$a@SKr)g$ zM*E8e2?~SV^s!Ox1J|Cz-TA)$q3(hHJE8L8s3%iCj|E8&H|N3b{vio428325D&>19 zr%A0XW=BUZujaM9JOiWwY(tTiPc|o;X?+po|3WOC$No}2#Q#ywgNV}03)rLa@Lqjd z*-(xSQO_$ODmns4pGTJBoQ$)*b4`?1kgs!Gdk4WGDa_ZW0o3>e&IQ~>cd=T(+d9Pj#5?XtSax8SBoSdkVq3<9zb|+1Uz`X56@M} z3S=K%#9S)SeRyhH99z4*9PuaJi6htLOA%e*Z6`*N2D5MEqE6Xx|U`s{(?bsv6>55Lui=OKob z=6v{dKKgbae!UOB$A`b#hwt*?n|=6$KKw=>e#D2T_$m&pLfAoiRs<61Q6E0(!(Yr^ z)WAgzT-3lt4P4Z~MGaikz(oyQ)WAgzT-3lt4P4Z~{|*i0j{j>UcOv}47D>w8d#)Iq zKA$`OWaNnw>*@6KD4JgLFZkQAaw~EKAEffB3)48({5`<|g3mMf8G>nxYw8?>zejM0 z;Ij<=7QwWoHFbu;j}uH=SyQJN{CR?D3v22qgFj0!T`o_JF!&P$)0Wj#7lS`SFl|*$ zwKMnw1k)DP)K&(+hv0gGWd_41oQ ztl3X6Z8=R{VDMWArmd!_^9_e1XA#Pw*84pJ(th1k)DJ z)Hw!!k6_x`nL5khZxKveI#XvD{5Zk1l{0mU!Jj9Xws5A7GWfFu)7H(@2!lUCFm2gP zbusuO1k;xAR6Bz|Krn6HOl@WGdkDUUV41r{WC$*7cIqcM32& zj9Zj*e|;2LW4E!(=rksNzbiNK>yF&X%T36fyZc{rFonK`;qYRJ+PCTt zotBUhh73WR@tsK%)|ormxqAKA$$4`V zznUcbCd{>8r*K4=Cc+@C;VBh>(fyC0oK*0SzeD-)*8_)k5ZhOXv>xr*{)tFg~`n~{GaccOE3BXNjRjW5F* ze(|{zX&sh@n*S9wp}1$>VEVfZ`Xi#n#OlQ6YZ*;?4QO%`-vZeqgh%Cl~xPLMj@&9#T&)eKRXb|L%>?$<2Ru z9hHPXLP_@Z;!+IRvnZ$VA0;C>3gt*oh;ci)`R$B8eH$fLy_uVMIrq(9ZpnS~^-wPG zRPIM_7MFm*UvdVK=?k76i26r2ccY#(zHwLX_~t%Pp<6E$=cA{KfS){xUQ8Z@h);#H zfCKwPJ&{hmgUq10VdXs}m2`@n5FYr44oqC@bMPUW3D6xy;J>2l_FEQRr zw_Jguo_WV|f%Bq&xf2WS-UNG2fWkAklbbJK7Mgqqsz08idM6g-K_Lo%L4|KaA(;hi zgY5is5aV&$?FDVhN811|X_@%; zSuVHc>2=(-=%j8dq1qGw8ksK4>L2Q~lfa=D?lL#A^w@&;LBaxf< z=gCDNWXR%H8k-)fhxC!xk>33z@vqmf*j&GS<&DsC{HLn>P&HUoS81IQ+8DFK*ntYy@T#b^cJAv`= zQ^QpFZLg4%))L7r!1tZnr92I9%T4?yH}S0U44jU+8EgU;b`st<`8(7^$FHEVqIikm zevrDz4E*E7_V|-=<=nm}C}_P8QufVwGvb%giTU+SgxJ1@U!B_pv$+XlNymj47%4{RiODXOouWsuNVjC7gPt0nx@QHoCru7g?UU(6XavDDMs0lrDCHSq z&c^B?9y4S)zo#Zg_?WCGCU-wcJ@RIWCuURtuAjqVZ1Pj6KIM?gXUf=oeRA{E zrDz<>^vMg<^7Ld25*Vi!5RF?}Pi}5N3^8`MOgzi2m90`vZjgZPXuawWtn%W2hY;WV zL#TL}@>A#?vmHzo>jqR=3gL!!RDse~uz(8VuAu)z$t40dFqGIR4LV})bE45WT2-dv8JG!ZrB4ijJ z>P_q)FDAN&62rxVh0)@XkwRj)kJZ8hVt6vH+2d#oCAy2nZal{~ni%XqaInawPM}tz zx6s!;K2Q|wse8p?$k>O6024=s$43)A1O0^|^lqp)j2itzx8or|R+VUbhYOxOtVORq zYj}L1*Ao(tpe5L&dR~Y6@JJpP3L0wZqXrV)Jw1hyBI8)bkC_)TFC8dRo)8hSFEZfRjs*2B81jg%~# zX4+24hMi2>V5K>Rswznwa@scBbXt=Q9YX4EQkOGnOHQRxV!EoKW*pr~rDY?V&X|gu zL34(wr3?%5SQe6$qo4;VGcCI*)l4NV+q5#KrJG45omMkx*R*6alT~FsYiY9S8nWZs zcG8ivnypdeDaBA_^vp=xNlQT$=)uq+nyNUCZD&(*#xgUi>6$4^PdaH=)m>9Dl9r*_ zX)}pln`RbLo0^kWp;A|M6-Bc%cGfYHsU(_o<6F94l>L{M1xdw{%5Kp%ZdCrCGA78;+LNTr`wSni#jFoWU5`DMvOn z%{DP`nPl43R5h!l?W_hNOat^*)^!xqg&iezTbAv#tLdqs~zLQDIstWDN>7mi6yz~v&B3r*u9k&=z&BG_Q!^o)t|o0=Ry7CqD63gZ&Sn(X zupyJ_r0gUH7n)3>Pp)e@imE5!cCzcHOdEFPz;zG-Ff1@U#g$cfT?!(gb=`ugr7})Z zc69|V5A#afE|iR(rD5vmaT=a(rX4Mtf^uxfR^cZqJYLsKSvM_+3{OR&tC@~1TQJL{ zW*Ul`bzw|sDxFF>@G@0*$VroF%e0djBbBmk&B($rF&r==8LH7Ci*4GPg8{`q1;YwE zlc5S7My6Q^QHBNIQk+y4opUifhMjVaOj6Be(ke*O7|^V)SV=VlJAlh*=y(<}0A@!9 zuO%T6B8u!Xv2-(=N|ULkGilf?Obbq&)y#C#f~Pt#O6sO;>q*VFWzzvOs1Np(%BTh$ z-N`7ro-*8Q+ECMON|!awg1KgN3qzFAQ>LCyp$xG%2{S?GQy4ZiMN!IjRJfv*%4Rbe zJqg)WONF&t@EE8AT;N}tX(1pY+QGC`3r3WJgc*zxoF@&pml3z1VHmHQfvY&0no=Q} zX~LILZs=B4MUS&^O4T;f7-U5@Wei(7t*CC=g}0@W@QakKXBFMTc*ByMq^fGRj4*|` znbxx~2DFDUG#mt@G{#Yb{aT6wFG<-c#4by-99dRixEXk*ZWvixM#KV3L;y3brJxeS zhVnDAWy_d^5KB@p1Pz?c45pY&I%&Y(piw9UZjrSW=-<^bm1JZDXty| zq#3{ry#PbZi!vtH~m35f54*uld7!6rmL!qyWX_-DiVwWOh#Harkh za#l&YvYApafu%8+h6+!`I>WXdSfFCSM-X%j%fb|t(rsNs-_kM#D--iKn#Q!DWetoi zMly>DnWh^Zk;TEZ5C26VfU%`vp_z=OU@kXI84(vfap5LO69LzTp~9kJEC`AS)mW$` zbrYs&TNH`pw4#H^l`%_MGS*5M2RJXB(awUe3OCm+O>xW&qAXOcPz760xjLpD1Uy}F z&ir!A1xOQEGb~{dK!x+m1aSd8wk9zsu;G5B?Oi~I;K+iy=7$JN-iRW zVIUG?mVl)xurLJ+3l+j6yf|4*bh?Tafo>a6o?|9q_zG!UMl5qM&Z=R-$uQw1Wtv57 ztXz^=74tNF-G#Gdu%dwzVji|E+t5@aWo5Ei9V3GXtzdZtl_1cgJPVcEs)^8oZdgv% z$|5SKZLAtl0V8fEO@wC+@f09z5$>i__(*4yG}A+~I_9h_MhE^3XD8>e)r<;1$XJvwK*=v0K*JT(TXRP%w`qaN!qY%ELX8Y zGB9l#>6Dqo?1On9vm~hrOBtvx17k5=89t5Z=wPjfh;Lv?0nUa72h^~($s|qW$*e6* zdVq}#@L0>GFf+l+Z4C>MG=j41kXa{9C1YTk!@Q1A49%xC!-2vwhJ#oIYsKObTEXOj zn3hRl_}r)lQD&1A%RN(TJd0V$IPW?$V_oz zfE7AsDpk`QtO78Xrd8+$)`NfngT%OEje$W)K>?UA9W1Xfd|BPVaz@W6NdvJCt4=IP zTr9Xu7ry7hOtAFE#gC2A$|liYgkV*6WeAB_h3l*o=6*MWH3U2oCWcEa9kGnof@#@TVU|ocTC9aw5EQS=rq+$Aii9zRx+E`oZX37S0 z7j~3XU}7*k8RL!l2$PVD$p9`0f5xR2)^}JNV@9HoiXnFu1YQl(3awIY7k&(jFq4RI zSa@g{v5cL{KskB_vmPc23<7KcmwpgKOGEcc%E@9v!DNV~IWF#?-3+d25MCWUt6_txY;L z5Wz|XW~jUHeFN9UkPa>cvqz*+aFJqXF^ZT#leU8kIa9_AV;Q(wz-kjlVS_sB;_4M^ zJuC&`y|@lTKM{^-a)hg6*vFnY%%@_+z2{Y{@^;+LKKx%tiP~&#ridw!MuR$ zSS&KJu*gv016SR^1r!#b7~*t>MpDZlo?^yIo3Kt;F$D!gHV1A7Z-FMT4}dET87pB` zL0d)!7oeE3GO!4Amlh(J)G)QtOqzsq;i{3G1dfDW!&+!%fORsWE2bn`m}3sZg`S0uaIz?@La?GyJZW`AHCl|OGfBt=+oCvuOPsWV znaxEo#x)`?IdL%xUq~9bB*H3Cr71S6U~zyeMNH)wR?O@UHcd=eLsHX##YPO)gII3k z5($=zYgP@{1dtK)6P9rZ_gHPvnkIvF3odN2DUy-lZMbO7Al%s&G_1fLbOo`=!Bw7N zX*xDsvM>UW;?g&rM(oApj9y|{k%o>S6qW|)N)}6SL?#)Fa+3_qPNFyH2SPW(Fk&dK zUa=2=%XvsgI~AA+bp;c@g6$2A8F7LxF`5<_VdV(_!4(MBB(i}RoKB{(SjQ$#id1SL zwqc!`W(#C;m<-}_MuQ8%=q)T^aixjC4i#bz25-hX#dJ^uSM^!Vz{HQ`j%ArJasyXd z*n&~9+l32sm@q;gR01Yg9b$P2TVr!OCc9)>b&|LMg9mB|x3n99Kth9+F)@CKTxl(t zMQxash$~1t4b5UF0wab&#)bn{5n39{2+W|Ek>QsZI}{)gJLoo+ z8nkT#&%w&p#J&_3f!F||%@tUVg3BihOD7ltSYzi2CW?(C$cc*!m_3%DFf;=q=vk~; zut4McHpsDtje(?0Lw?{!*&Ih1h_Ox%9zu!6^C^fE`C+SaIB`&xRAy4j#W4u z1uF{6rNM<)!#HhRdf}ozqiM30#Xl;j)ScxEMKubglh$? z%CR1S&*RDk(;gPDSbAg-mf-MMP~%z!dlCv(^%xzKLO&L$#+6dtXkl=;Siny5;9&Pq zZ=HcxwTDMHCA#|$_jeC(^^)enLfx*h?gNEQiMMXpa&VvzZ%FUoS67!vB-*@plQ&VG zjtv7|N`E)8-O*A>pTC6Ot}c~~l$FrC-o2%=+sn%EIyUxc*|zjZIbDA>I@P+Q7b}zj!dgZBsx?M`gy<9ci!9qUf4U7Hvk^dY2n_C`GG486teRrDGl79uB&^4GBMxJKgR z0d`W|_I|v@j@I#l_4pv|s(0hXZ4BLpH9d9Gg@2l!KL3x?({)JSj7iJoRS;Fx@EGG_a{})5xaVH}!AYzvDR5cnx?bSx zah`p4dipHVGe4Q0evV+I^Km<-9rcd_-umCBr(Y&K^wf)+)MufyGf3kx( z^y^65k#?cpS)>npw{s-Adre2+&Ye==a6E9?{MyK=Ky94xxZf;&7xG<01pJtrUcxUt zdGxRUEo33yvA7#+ys@GFj>u7I%ca*{omzb*v7q`k&U4RAPqU{32#I3^=dCz%=+kXf z-;Bji2F+OGdqYMnao;>Uw*Gk7j~ZJ^}Li&}jrZ-$`|iSp2@=&9OwW zE*7_95d#A!11*Eb2F*gG#Q(j))>z|xpL$Y=~@ zj3Iju_@-FA9k|25J@|Li(;wryd4I4a*7&}V8B3g;XU5jQ7rK$}tFdGH@!B1+qgRCH z1?ytE6_e2i&_Iu#vPdj;&=~v;cuqpLeS|?d=jjknr^GWyJh#QR-WJo1S^U`V0xTh! zATM?C;_?5M2E^|#h~HZfV@SXGK!v%?m9pd*MD8|qs%76Xl^e}_*s1F_Vz&9Q2Np7TgXptRTc{!inq$Umv`=$q<>F~dM zPcSEwq%MMHeq*71o(GHghNp|zA>PGr=N%RJ99M*po1W9615fX5vK*1SKxjPl_~P2`V>eW2!L zP}j12q?R7~j{Fw!;kmF9X-4H}3V*_>TI#zLCI1a;(f1*VMBe~yIKzN=^qpWG))~+k z9f#kAvkXW?e})c*H!)y+^s8VUzK#KM^n1kZdIspxUqg!UW(I7HJ`BZ#w=y6XeFwr* z*kC|=^gYy$$$&l4hp3Ky$u@}C6}^VIxl8Cb{0>H6A=z?F>XGPgiCYT;iqQwCKR4DF zL47#7n}F?$@&JxTuYtP4I~w``9E*10Z@4Ye0fOVvSBb&R4LtzvkJ68Hh4(Hv3W8J7 z0s(JbHiYDX=yK}zt;^|G0nbEVAgT8;aUPDIARW9d`d-vI8-0VikgvN6z?Y)|Qb-q* z?OZfKb@oT@0)r=|;2%&_Q@i{#psV{OkzEt3x4@_-Lcgz86QP3nG;So<0kO_yheYZ<}5lF{~;5OrrkjNeW(|Ve**bX{M}$TFMa{}aQy8wH1S&?dTo3gdL4;B z27ENW9W-_E(~#%N_(#UDU^b^J7BSQEbib=Ss&;JGed3(R_HaXlL5nurH$o&~G8 zfj&v`ry*$|z8kUxr6nUs0_Vasn3WMQ@Zi6Z>{ozw;9QI-0J39g9m8Gv8OZc@U=HBC zq%d>{bXO7XCBQG@TsGPx1)hjf)pcle70$+gqN-0aTQ18E*UZ>|!9)0abMTKqGtFtX zfM%4_ybJhcoGIbo!|`_ke}fPIDGxvI^aJ@CX{EzU^5{s@pZdtYFUamEvOnh~H-T}} z*Ez5U!0&h~B%9ZXAT@a2N3s%QL7nhOHlq(Tj8fC{J{qfxMqxCMg61VoQ$SO1Ezw9# zuW=1jmzNmU8@E!2eZ=z9ce{tmPyFSf&2ZPcrW`si3Kum%kS* zUM!VMO&Z7lDe!Ol@bnHF9iImNa@Yq{5DiUk^N>;#do2&ZAHfP8uh`Sjywj)hHBf*z zKuz!BY`y?Cy@Jh+InHL~y}UR^<9Ct+=RiAA;wd%#ImiD1_=g$3Ga5Qq66G&>G4<@6 zuiAg+cn!jmb(EiX`ocHvYWy~peYkFbAHdQz#5PRCgmte+-y@ ze013;(S4fH#Sj(ha5jC9xB2goIE?TDiRYaLPZ(7+q~<(m7xNG1R^}0RP#^SghitX^?)z z$3o+H1Nf&rd^EI$%gj1(eW?Qur=<=|mUsx)!ALZ1=M?00!FsL;dS>aub*st4%xti2M{H_?slxB?w*9G6F8T$ zDX&ALuKf`3Q#hCJC$;Qa_-)Y9s$>IB*4^E#yZ;7|u45YM$EpLj)Di2@>GOZI`~lMU z9!Ap!$85pbl;)DW4`N@6iwRE$yQHQTUhq*AB)tM=uW#e{hk>Wv1J4!6uxZvCBk&TLjA#q{|AmIp_W2PLfBvW=r{QAuleYm8T`t6KH9{8#c~c1Q_j#c zeVPYZpq-YMTumbpW2PW3S=sI|Glc+r)H8+Hm1GK!Vw@hpxjaVW8DBw*^ZUWzKAeqz z76oqM5~>qA{pGtFKM(r|EaE1rpbV zYUg-bhb&wuh8SxejweOP3=c(Ilk;Sdnnrx=a=aRK^J!W=8oDCK z`-AK2J;<*9K`s2FKMmPKz!Z(Ag8nL?m)vj`e6?`qrU;!RUn}= z`s={Lb#xU%XEYpKxbCxcl0;`P9-6-{1dpe)wly$+-DRMsGg^yAgTT^R>!O4fmvjdE zgA3L*ffJpzhlBIi<-m!~+C(U}?hxqdtbG(Et1&y%S^F3orHuzVYrhBvUqod(Ywrs- ztj&O)&f347zxLxGr?d98*t*X{5ISq$8*Es20xi&4TN_%iZW9EdGx{;~^LyY!XY}6y zJO&avqwhwOe~S#A(XR&@*WHG;>5M)JtF?{W7%n1z_o{ zA418Gp=COw-v#gpNa&3I1i)^HLT5Av3BHa7>5MJ~@NI-oI-^!_)q3j7!#Ed6>wX4# z>5SF|7p=PvBSvR*X=vfPm59c4Mqfnx|BM#sjBWw14?{(CMxO{ST)P$-I_Ixhu~~=24V=_fiXmRXBvpF2i*!(SjaM%Ul+{_l!(IFdg8jctR_b;X%1{zE`(dR zyk+siz@pl%jUP6bQ#5y6^?U1YVX|HpmK3zVV&Yf;gG1TN-*XHv3O1fL!Kq20Nye1`B#$P+^agXg z!r!a19$o1#sp##hvRr}GZYhQ#3H^71v+dTm7#!; z7C_LDbR&#A5cpke0saP%mk8cCJ~q0sf2e0*ytg1R06*ux@jy?{#>2Xn*Hr!mngc`Q z8x^^nkk^_`xW6AiUhii-H_1kN&#{8g`(1fSq92)W?tzT->-9i3A0%m!$6Job!|7OM zWZ{hXo%->fV%}|Ob%20B&*V^}f7q++{WgBSXLz*WRrA_H9@+s5Jk8+|jt}9L%U&;! z-@hN?^{?MQ-ak;>&_8qoi6w;tQZy)*bD>xu9A3OQ9H@zhmwYcAt~nj9t63Ia&_UV7 ziuv$KaR$GDl^?IUJ{+wHEsi`J`AXy);W&`d7sBz#7_gi7 zM#hid6OIwC=6HBMs}P!h%*zHg_EF7z5f#6359A459tg)nJvW8}q09Fq5>$BP(Z~zO zQM4=^cfx^v9&*nf)Y#1HtfD&msLm>?v!Et4wkNEjr3HIxf@>Csmmmw)4X;qAse1tK z41^nAFZHqRgUI$#H}@d3nfJSm^*c5gt_vNxex@K=bJKAWDAX8ug#;XY6io)g^Ir+a zcB6LWrf@y97K-jc;o@-QI^f>67doK6L$=`?AYm{)d&Mso4T+2{>_x90Kiax#wVsrBVGpt-3gv|tZ*jsxf- z1Qff#p>sflmyn1J(BFb)4Cq)9%3mCL6!4wL_J*UO@ndM?_!1h&#So#+q>_(AX?Kw< zi#JDZinPMA>uW+qsBeB`5tz{>APQy$W)I_>o2pu`~!UHuAjn!;^X#B6j%TT_c z<}0D%UmL6@U(Hbp=7ligku8(Y98d_1TIaU)HM_&&G zjvo(3pr(9&xUVl?ln%0QX|%NENAVeq{77+BqVHFuS%zZ|YzCRS(5cBgGuC!TT}9Kq*f+VW^8zrUM42qQk&;jc}3 zyTuck^}u#^v^chePtY7lus`ENWBmt)3cd7Zc04k$ctS`IZ%n2 zDqga$uz{Xg-?^EiQL?8pm2lh4@9Jsw|s_s@aY@O_w=ad$iY#vS3gJ8 z@N86g-;OrhX*KrJ2ka7fcdhbifW(Hu;`mTu^MS%pVYI&oVE1Ux!Od8;;8S^t4F?h% z+LCw%w0rExP|v~9;i2L2u?^!x^eLSUMf&hk`B0iIJ8V4tyHnaYI8@x&vvC)GegMBD z&^y>aw9zh%-HzXN*vNarmnbyAXc9lgP}U7T8tBY!XXngl_G4kRv zPVGiV$1QC;ZEl65hxkW_B>v=V*$7vDcZj589>anfc}>ZN*kXyb&)>{ zX>Hq;A0sY-BTodYpcKSi1$$|8comYD!(6=&ku>olNrj+w$3)It+hfr@g1?M<0uX7 zKZ0ksF*?k##w6dP-UuP=n_Ch+8=m()8!mMhhx^L}r&$Pt*&&sJ8jOFG^_`|lrZ$?N zOYhl%v{;?I`&Q1eZYrxLERW_Y@yRdP@gde%-*?#Z z1qtY$IX*JxeOJuiWc$uG3)6SrYTMzqY$KuIEEqx3m!`tvNMSULV2WuC-zXy!WHT^Z zvJk{PTo|+O19Sd%cwEJl;A}HGoxHWvVKbf4+ELa=>O2|k{^2qFSPv^=F50mRzSPkH z!A81!(^7tX2wu~hLZnL$U&5E0$CADMCyd{k?@eKFrrGc^{%9xtIc5cDQY2Onh-X-|Fmkyzn;@ zyu_jyuXM6d?6Ie>&do$~GVmR3_$x78)6(D$e2$KN_pVYSZJseRVT^4?%MOW_ba`5F zvkP+iBd&Z#S9z#_v`b{$)(F(CBDC0(?Omft&r znyXpDiQasz)WLR<-CnA_Tc}a=a*o~sRoMnMZP>A&>r?cpPAc66e@NhN{tmkXPd+)!P~p4)b1{k?JuEr zi|lP2<@u0+#2xWDM%oiqG;(c;W2ea4CDbmF73`|J#f;d^rRq0}tY8z6Iz`scac*A` zj|<#V;@2*E_x2f7x#D@>uJTfqrwBqK+r(>n+M25};S#eLbP5LdmU!+H+50%kQ;vW{ zO96?!7*o*{?f#Yy@lZgn#JgQ&#f^N7qhS1<64h>z{eB6xOJsjnLhTmWni;K$Y+VVp zOJrx{u4bTtR?d50sf~7#?Jl8i71@Cjs$FDfdUb0_31u14*FP`Sz4dXPoti<3UMwl~ zq6)h*-jdieer~OYhk1zX)H;FMEwaDlD9>U9w0V7rP-IPx@(2a=ju}FcJz7R6pr6eU zitLMJgaW#>q<}dFNZk8hUg}7DdFKW6ASXC8LnyL8DWUd>HpMO7xs6%yWT|+V;kPC2 zwg))FaEWod$clUR0jWb|XPR#p+P=P|n+~DZJ7-WrgBNB{LhhGJs99Gcd>az8!etbEbk19zz2CY&)qY|AUNvk#ub58!RYN;`at@mV~}Zt1ZHJPk0*&R+sHKwk*%qH^B>Md5Lr zS;wL(_$cI@i+*Djdb0}tAj4yP`P?QR)T9?e=Hh=E_&EINf$nlqAE-iqex4*H=J31E zR-u2Y3jU|SFQm7XdHexec6_{MZaH77!Y7Kje`UGo3|bBRT>Z^3e5|x|5l=7Xs?byU zBJvj=Z^a9F!yJExUxmN|*l`s2h47a%-5yN#O~(fbj|V!$dx9PokHJuXgR|rF8OC2w z&7|}T`E&J)-kzEZ|3(%3g3#RbS`~at75srJczUpTE_r^8fhK*P<8g_rPkMh9`cG8B ze~sZ|lDLB{p3Z-&3jK3c@V^J1#--B!BaoBE@nJrW!agr!^3RNi$Ze>Cr}voW(nDVr z{2f*BAFG1@3h*T7xe9xuN3O}QE9b{&AaES?=Q+KQ|EE>>|GEl3QYBukV0icozmnL= z8<4Be-&zHKZx#H9fhYMZ$Lo_-=>HSL!``@|iA%^QtI%HnJ|UFiOMlP#B(C+40bVx0 zO1w%|!M6jS@bMK{yahBT{zw%*AFF~tTLu4275p!%;KePco>ADB6$~d)WRv<6FU#HiXrDIxknbvFttIRmLt~U|ZR2o4%}o+L^i2 zFvDFV?))i=vI^`z1s*0FqPuP0Z8sq&yD2imf&|Rxdk)i`y`k;_Y)_Xl0(ac}_cY2dOy!jiS(Ni6 zlG$TL_Y7xoqE30AOqjVXG@F^w>1?LneXugNFdf_n!d)$Lc%cHipf9~WV|?5QHTdRdh$JE<1Fm4j?O&s zRL(lz(z!i96VWl?6wf>9aT2(Ei4TS8vb%Bq2fr#fdbOC2ao4-QJTT<*2L^|SJjp3& zQ}bdvDQlb*Ipd+?ZgzQ7-V;=1eP{ZwxR+mEi75DYPG%Q~JBN5$sk~5X9y>CK+vZ4N z94tL3a(Jw(FghYNQ13CvJRz|ZG(TJ<&Jd37nKr}Fq-J_R2lF#)qYEP6 zy?_5`;gEm^`iBZ44|Rzw=1!62oW%O)e>J7wGorN^E_2u+_6H9Q<3aI z2D=+2`M2VFh7OUg=M}NcV|o(Tqj*rC9klaJRYd#Zcb!Bke#gn9_IQXqrEkMYznLWJ zi+xg&4sl{3zn~N8?I@?;U=py{PZeo9uTSz5jgX(Cr8|)!or?Nm-&LgIcc4W3qQ2<= zJ-oij8H(SPDy4kDs6JieSJr?A3GA|sn{3b*jeL0fdYU11g|er_S=1;GE(fA zutTJO49H(!>Q|bmu!!_eQ7^)lGlHkj01 z;{zxo5>a35zdzSTwdki?$`4Urq~8ALOns?~)3-|YcjUlxQsO;o_NKT7Ra(uw-~Mq8rjRLR@SHA!>q(n&DRfl^%si3>4CFoujlnE z^%v!V|2$1jzC*MnQu=u#k@t~FKRMz-pBIM03oB`NR;hpDm{*}vuFCoZSEz_pJjd&w y;qtEnmgZt1j+j3vz6sl775Seoniz0IXmQ{>D%)R(vbpLX{1dNIS4D*iQ2HNZQM3&J literal 0 HcmV?d00001